[英]Python imports across modules and global variables
我有一个似乎相当基本的问题,但我似乎无法在任何地方找到任何帮助。
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()无法说出NameError:名称'XYZ'未定义即使从file_a完成的标准导入(如'import sys')似乎也无法使其在file_b中可用。 我认为应该工作。 我的理解错了吗? 如果是,那么有没有办法在文件中包含常见的导入和全局变量? (如果它有帮助,我一直是C ++和java程序员,现在我开始使用python。)
我的理解错了吗?
是的,因为from file_a import A
的一行from file_a import A
只将类A
导入到file_b
的命名空间中。 file_a
的命名空间file_a
。 如果它不是这样的话,那么两种语法都没有意义:
import modulename
from modulename import something
好像你的想法是正确的,然后在第二个表格后你总是可以使用modulename.someotherthing
。
如果是,那么有没有办法在文件中包含常见的导入和全局变量?
是的,使用星号*
运算符:
from modulename import *
但这带来了命名空间污染的问题,例如from file_a import *
将在file_b
导入所有在file_a
完成的file_a
。 你最终将失去对你的进口的控制权,这会在某个时候咬你...相信我!
当出于某种原因需要from module import *
,命名空间污染的一种解决方法是在module
定义变量__all__
,该变量将使用星号运算符导入的内容列入白名单。
HTH!
导入模块时,该模块中定义的所有变量都可在其命名空间中使用。 因此,如果XYZ
在file_a
模块中可用,则在import file_a
,可以将XYZ
作为file_a.XYZ
访问。
这里的一般想法是,您的命名空间不应该与其他命名空间的内容混在一起。
是的,你的理解是错误的。 每个模块都是自己的命名空间,只有您在该文件中显式导入的内容才可在该命名空间中使用。
与其他答案相反,引用file_a.XYZ
并不是特别Pythonic,尽管这会起作用。 相反,您应该在file_b
的顶部导入XYZ和sys。
import file_a
from file_a import A
我认为问题是:你真的不进口XYZ!
from fila_a import *
可以解决你的问题,但这不是一个好方法~~~
你可以在file_b中写这个:
from file_a import XYZ
它完成了吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.