访问“模块范围”变量

时间:2011-07-27 09:05:31

标签: python variables module scope coding-style

我目前正在学习Python,我必须从事Python 2.7项目。

在模块本身的功能中访问“模块范围”变量对我来说有点混乱,我找不到令人满意的方法。

到目前为止我的尝试:

方式1:

my_module.py

my_global_var = None

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

在这里,我认为令人困惑的本地和“模块范围”变量可能非常容易。

方式2:

my_module.py

import my_module

my_global_var = None

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

此处,“my_module”的名称在必要时无法像“方式1”那样轻易更改。另外,将模块导入自身听起来很奇怪。

你会推荐什么?或者你会推荐别的吗?感谢。

4 个答案:

答案 0 :(得分:24)

您可能希望阅读Python's namespaces。方式1是正确的但通常是不必要的,从不使用2.更简单的方法是使用dict(或类或其他对象):

my_globals = {'var': None}

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

分配始终进入最内层范围,始终首先搜索最内层范围,因此需要global关键字。在这种情况下,您没有分配名称,因此没有必要。

答案 1 :(得分:4)

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

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

答案 2 :(得分:3)

在自身内部导入模块会产生不必要的副作用(比如多次评估语句。)我建议使用“Way 1”和像pylint这样的工具来帮助验证代码并执行常规做法。

可以在http://www.logilab.org/project/pylint

找到PyLint

答案 3 :(得分:1)

完全避免设置全局变量。您可以非常轻松地创建包含类的新命名空间,因此如果必须,请使用类变量。

对于任何严肃的事情,无论如何都需要适当的设计。