关于python:访问”module scope” 变量

accessing “module scope” vars

我目前正在学习Python,我必须在一个Python2.7项目上工作。

在模块本身的函数中访问"模块范围"变量对我来说有点困惑,我没有找到一个令人满意的方法。

迄今为止我的尝试:

方式1:

Myo-模

1
2
3
4
5
my_global_var = None

def my_func():
    global my_global_var
    my_global_var = 'something_else'

在这里,我认为混淆本地变量和"模块范围"变量可能非常容易。

方式2:

Myo-模

1
2
3
4
5
6
import my_module

my_global_var = None

def my_func():
    my_module.my_global_var = 'something_else'

在这里,"我的模块"的名称在必要时不能像"方式1"那样容易更改。另外,将一个模块导入到自身中听起来很奇怪。

你会推荐什么?或者你会提出其他建议吗?谢谢。


您可能想了解一下Python的名称空间。方法1是正确的,但通常是不必要的,不要使用2。一种更简单的方法是只使用dict(或类或其他对象):

1
2
3
4
my_globals = {'var': None}

def my_func():
    my_globals['var'] = 'something else'

分配总是进入最里面的范围,最里面的范围总是首先被搜索,因此需要全局关键字。在这种情况下,您不会为名称赋值,因此这是不必要的。


在内部导入模块可能会产生不必要的副作用(比如多次评估语句)。我建议使用"方法1"和类似pylint的工具来帮助验证代码并强制执行常见的实践。

pylint可在以下网址找到:http://www.logilab.org/project/pylint


方法1是绝对必须重新绑定全局变量的正确方法。但是,您应该问自己为什么要修改全局,以及是否有更好的方法(例如将行为封装在类中)。

应避免将模块导入自身,因为它很容易出错。如果模块也是脚本,则有时需要导入__main__,或者如果模块是包的一部分,则可能需要导入foo.my_module。简而言之,不要这样做。


完全避免设置全局。您可以很容易地用类创建新的名称空间,因此如果必须,请使用类变量。

不管怎样,对于任何严肃的事情,您都需要一个适当的类设计。