跨模块的全局

时间:2011-11-26 09:35:40

标签: python

哇,这看起来很基本,但我无法让它发挥作用。我需要做的就是存储一个全局字典,可以从其他模块访问和修改它。线程。

实现这一目标的“最佳实践”方法是什么?

test.py

import testmodule

class MyClassA():
    def __init__(self, id):
        self.id = id

if __name__ == '__main__':
    global classa_dict
    classa_dict = {}
    classa_dict[1] = MyClassA(1)
    classa_dict[2] = MyClassA(2)

    testing = testmodule.TestModule()

testmodule.py

class TestModule():
    def __init__(self):
        global classa_dict
        print classa_dict[2]

输出

$ python test.py 
Traceback (most recent call last):
  File "test.py", line 13, in <module>
    testing = testmodule.TestModule()
  File "/path/to/project/testmodule.py", line 4, in __init__
    print classa_dict[2]
NameError: global name 'classa_dict' is not defined

2 个答案:

答案 0 :(得分:4)

最佳做法是不要这样做。

global关键字实际上是错误名称 - 它只是指模块范围,而不是本地。没有办法让每个范围内的变量自动生成。而是在一个模块中的模块级别定义它,并将其导入到您需要的任何位置。

答案 1 :(得分:2)

事实上,你可以像你想要的那样取得成就:

testmodule.py:

classa_dict={}

class Test():
    def __init__(self):
        global classa_dict
        print classa_dict[2]

test.py:

import testmodule

class MyClassA():
    def __init__(self, id):
        self.id = id

if __name__ == '__main__':
    lclassa_dict = testmodule.classa_dict
    lclassa_dict[1] = MyClassA(1)
    lclassa_dict[2] = MyClassA(2)

    testing = testmodule.Test()

请注意,除了您的想法之外,全局使用其他方式。如果您编写global varname,这意味着Python不应生成本地变量varname,而是在全局范围内查找名为varname的变量。也就是说,类Test不会生成局部变量classa_dict,但它会使用全局变量classa_dict

因此,global在声明时无需告诉python该变量可以在任何地方使用。它更多地告诉Python已经有一个带有这个名字的变量,可以参考。

这意味着,在testmodule.ty中,行global classa_dict表示:查看模块中的某个位置以查找变量classa_dict并对此变量进行操作,而不是创建新的 local < / em>变量classa_dict

test.py中,您可以指定classa_dict = testmodule.classa_dict告诉python lclassa_dict引用classa_dict中的testmodule.py。因此,global中不需要test.py,因为您只需在testmodule.classa_dict分配内容时修改lclassa_dict。然后,Test中的班级testmodule.py知道它应该向testmodule.classa_dict查看,因为它使用global