Python:如何制作跨模块变量?

时间:2020-03-06 14:48:53  来源:igfitidea点击:

__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

我们已经可以使用模块级变量执行此操作。无论从哪个模块导入模块,它们都是相同的。因此,我们可以在将其放入,访问或者从其他模块分配给它的任何有意义的模块中,将该变量设为模块级别的变量。最好调用一个函数来设置变量的值,或者使其成为某个单例对象的属性。这样,如果最终在更改变量后需要运行一些代码,则可以这样做而不会破坏模块的外部接口。

通常,使用全局变量做事通常不是一种好方法,但是我认为这是最干净的方法。