繁体   English   中英

Python跨模块和全局变量导入

[英]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!

导入模块时,该模块中定义的所有变量都可在其命名空间中使用。 因此,如果XYZfile_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM