David
David

Reputation: 5036

Modifying a variable in a module imported using from ... import *

Consider the following code:

#main.py
From toolsmodule import *
database = "foo"

#toolsmodule
database = "mydatabase"

As it seems, this creates one variable in each module with different content. How can I modify the variable inside toolsmodule from main? The following does not work:

toolsmodule.database = "foo"

Upvotes: 11

Views: 9671

Answers (3)

Lennart Regebro
Lennart Regebro

Reputation: 172377

Pythons variable names are just labels on variables. When you import * all those labels are local and when you then set the database, you just replace the local variable, not the one in toolsmodule. Hence, do this:

toolsmodule.py:

database = "original"

def printdatabase():
   print "Database is", database

And then run:

import toolsmodule
toolsmodule.database = "newdatabase"
toolsmodule.printdatabase()

The output is

Database is newdatabase

Note that if you then from ANOTHER module ALSO did an import * the change is not reflected.

In short: NEVER use from x import *. I don't know why all newbies persist in doing this despite all documentation I know of says that it's a bad idea.

Upvotes: 6

vartec
vartec

Reputation: 134701

Why don't you do it like that:

import toolsmodule
toolsmodule.database = "foo"
from toolsmodule import *  #bad idea, but let's say you have to..
print database #outputs foo

Upvotes: 2

Daniel Roseman
Daniel Roseman

Reputation: 600026

Sounds like yet another of the multitude of good reasons not to use from toolsmodule import *.

If you just do import toolsmodule, then you can do toolsmodule.database = 'foo', and everything is wonderful.

Upvotes: 19

Related Questions