从子模块创建全局变量,使其在整个模块中可用

3
假设我有一个名为“mymod”的目录,里面有三个文件:__init__.pysm1.pysm2.py。模块的内容如下:

__init__.py

import sm1
import sm2
global _defaults

sm1.py

global _defaults
class get_defs:
    color='blue'
    number=10    
_defaults = get_defs()

sm2.py

def printdefs():
    print _defaults.color
    print _defaults.number

所以,我想做的是在子模块sm1中设置一个名为_defaults的类,可以从模块或子模块的任何其他地方访问,以便子模块sm2也可以访问和打印该类。我认为这个设置会起作用,但是当我运行时,发现并不起作用。

import mymod
mymod.sm2.printdefs()

我收到了这个错误:

NameError: global name '_defaults' is not defined

有什么建议可以做到这一点(以及为什么这不起作用)?

P.S.:

我希望使用全局变量而不是只设置某个要导入的变量的原因是我希望用户能够这样做:

>>> import mymod
>>> mymod.sm2.printdefs()
'blue'
10
>>> mymod._defaults.color='red'
>>> mymod.sm2.printdefs()
'red'
10

因此,使用全局变量是我认为唯一能够像这样工作的方法。

谢谢。


这不是 Python 的预期工作方式。这似乎更像是 Rails 的自动加载器,而在使用 Rails 后,这是一件可怕的事情。 - Chad S.
你能给我推荐一个“首选”的方法来做吗? - TomCho
1个回答

1

global 不是你做这件事的方法。 sm1 应该只设置变量,然后所有其他模块都应该导入它。

sm1.py:

class get_defs:
    color='blue'
    number=10 
_defaults = get_defs()

sm2.py

import sm1
def printdefs():
    print sm1._defaults.color
    print sm1._defaults.number

但是我真的不确定为什么你要使用全局变量而不是某种工厂方法或类。如果您可以提供有关实际项目的更多详细信息,那将非常有帮助。


谢谢您的尝试。我想这已经很接近了,但请查看我的编辑以了解我想要实现的内容。 - TomCho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接