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是绝对必须重新绑定全局变量的正确方法。但是,您应该问自己为什么要修改全局,以及是否有更好的方法(例如将行为封装在类中)。
应避免将模块导入自身,因为它很容易出错。如果模块也是脚本,则有时需要导入
完全避免设置全局。您可以很容易地用类创建新的名称空间,因此如果必须,请使用类变量。
不管怎样,对于任何严肃的事情,您都需要一个适当的类设计。