Python:如何制作跨模块变量?
__debug__
变量很方便,部分原因是它会影响每个模块。如果我想创建另一个工作方式相同的变量,我该怎么做?
从某种意义上说,如果我在一个模块中更改foo,而在其他模块中对其进行更新,则变量(让我们成为原始变量,并将其称为" foo")不必是真正全局的。如果我可以在导入其他模块之前设置foo,然后它们会看到相同的值,那很好。
解决方案
这听起来像是修改__builtin__名称空间。去做吧:
import __builtin__ __builtin__.foo = 'some-value'
请勿直接使用__builtins __(显然是多余的" s"),这显然可以是字典或者模块。感谢我们指出这一点,在这里可以找到更多信息。
现在,foo
可以在任何地方使用。
我不建议一般这样做,但是使用此方法取决于程序员。
分配它必须如上所述,仅设置foo ='some-other-value'
只会在当前名称空间中对其进行设置。
我不以任何方式,形状或者形式认可该解决方案。但是,如果我们将变量添加到__builtin__模块中,则默认情况下,就像所有包含__builtin__的模块中的全局变量一样,将可以对其进行访问。
a.py包含
print foo
b.py包含
import __builtin__ __builtin__.foo = 1 import a
结果是打印了" 1"。
编辑:builtin__模块可以作为本地符号__builtins__来使用-这就是其中两个答案之间存在差异的原因。另请注意,在python3中," __ builtin"已重命名为" builtins"。
定义一个模块(称为" globalbaz"),并在其中定义变量。使用此" pseudoglobal"的所有模块都应导入" globalbaz"模块,并使用" globalbaz.var_name"对其进行引用
无论更改的位置如何,此方法均有效,我们可以在导入之前或者之后更改变量。导入的模块将使用最新值。 (我在一个玩具示例中对此进行了测试)
为了澄清起见,globalbaz.py看起来像这样:
var_name = "my_useful_string"
如果我们需要全局跨模块变量,则只需简单的全局模块级变量就足够了。
a.py:
var = 1
b.py:
import a print a.var import c print a.var
c.py:
import a a.var = 2
测试:
$ python b.py # -> 1 2
实际示例:Django的global_settings.py(尽管在Django应用程序中,设置是通过导入对象django.conf.settings使用的)。
全局变量通常不是一个好主意,但是我们可以通过将其分配给__builtins__来实现:
__builtins__.foo = 'something' print foo
同样,模块本身是可以从任何模块访问的变量。因此,如果我们定义了一个名为my_globals.py
的模块:
# my_globals.py foo = 'something'
然后,我们也可以在任何地方使用它:
import my_globals print my_globals.foo
通常,使用模块而不是修改__builtins__是一种更干净的方法来进行此类全局操作。
我们可以将一个模块的全局变量传递给另一个模块:
在模块A中:
import module_b my_var=2 module_b.do_something_with_my_globals(globals()) print my_var
在模块B中:
def do_something_with_my_globals(glob): # glob is simply a dict. glob["my_var"]=3
我们已经可以使用模块级变量执行此操作。无论从哪个模块导入模块,它们都是相同的。因此,我们可以在将其放入,访问或者从其他模块分配给它的任何有意义的模块中,将该变量设为模块级别的变量。最好调用一个函数来设置变量的值,或者使其成为某个单例对象的属性。这样,如果最终在更改变量后需要运行一些代码,则可以这样做而不会破坏模块的外部接口。
通常,使用全局变量做事通常不是一种好方法,但是我认为这是最干净的方法。