I have a question which seems to be rather fundamental but I can't seem to find any help on this anywhere.
file_a.py >>
from xyz import XYZ
class A:
.
.
.
file_b.py >>
import file_a
from file_a import A
class B(A):
def __init__(self):
A.__init__(self)
def someMethod(self):
XYZ.doSomething()
XYZ.doSomething() fails saying NameError: name 'XYZ' is not defined Even standard imports like 'import sys' done from file_a does not seem to render it usable in file_b. I assumed that should work. Is my understanding wrong? If yes, then is there a way to have common imports and global variables across files? (If it is of nay help, I've been a C++ and java programmer and am now starting to use python. )
Yes, your understanding is wrong. Each module is its own namespace, and only things you explicitly import within that file are available in that namespace.
Contrary to other answers, it is not particularly Pythonic to refer to
file_a.XYZ
, although this will work. Instead, you should import XYZ and sys at the top offile_b
.When you import a module, all the variables defined in that module are available in its namespace. Hence, if
XYZ
is available infile_a
module, when youimport file_a
you can accessXYZ
asfile_a.XYZ
.The general idea here is that your namespace shouldn't be cluttered with the contents of other namespaces.
Yes, because the line
from file_a import A
import only classA
into the namespace offile_b
. The namespace offile_a
is left alone. If it were not like this, there would be little sense in having both syntax:as if your thinking was right, then after the second form you would always be able to use
modulename.someotherthing
.Yes, with the star
*
operator:but this brings the issue of namespace pollution, for example
from file_a import *
will import infile_b
also all the imports done infile_a
. You will eventually lose control of your imports and this will bite you at some time... trust me on this!When for some reason
from module import *
is needed, a workaround to namespace pollution is to define inmodule
the variable__all__
, which whitelists what should be imported with the star operator.HTH!
I think the problem is: you do not import XYZ really!
can solve your problem,but it is not a good way~~~
you can write this in file_b:
It is done?