Python跨模块和全局变量导入

时间:2011-11-17 10:36:49

标签: python import python-module

我有一个似乎相当基本的问题,但我似乎无法在任何地方找到任何帮助。

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。)

4 个答案:

答案 0 :(得分:5)

  

我的理解错了吗?

是的,因为行from file_a import A只将A类导入file_b的命名空间。 file_a的名称空间不变。如果它不是这样的话,那么两种句法都没有意义:

import modulename
from modulename import something

好像你的想法是正确的,然后在第二个表格之后,你总是可以使用modulename.someotherthing

  

如果是,那么有没有办法在文件中包含常见的导入和全局变量?

是的,使用明星*运营商:

from modulename import *

但是这会带来名称空间污染问题,例如from file_a import *将在file_b中导入file_a中完成的所有导入。你最终失去对你的进口的控制权,这会在某个时候咬你...相信我!

由于某些原因需要from module import *,名称空间污染的解决方法是在module variable __all__中定义,该列表应将使用星号运算符导入的内容列入白名单。

HTH!

答案 1 :(得分:4)

导入模块时,该模块中定义的所有变量都可在其命名空间中使用。因此,如果XYZ模块中有file_a,那么当您import file_a时,您可以XYZ访问file_a.XYZ

这里的一般想法是你的命名空间不应该被其他命名空间的内容混乱。

答案 2 :(得分:3)

是的,你的理解是错误的。每个模块都是自己的命名空间,只有您在该文件中显式导入的内容才可在该命名空间中使用。

与其他答案相反,引用file_a.XYZ并不是特别Pythonic,尽管这会起作用。相反,您应该在file_b的顶部导入XYZ和sys。

答案 3 :(得分:1)

import file_a
from file_a import A

我认为问题是:你真的没有导入XYZ!

from fila_a import * 

可以解决你的问题,但这不是一个好方法~~~

你可以在file_b中写这个:

from file_a import XYZ

完成了吗?