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, because the line
from file_a import Aimport only classAinto the namespace offile_b. The namespace offile_ais 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_balso 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 inmodulethe variable__all__, which whitelists what should be imported with the star operator.HTH!