Python全局关键字与Pylint W0603

时间:2013-01-24 14:44:36

标签: python global-variables global pylint

Pylint W0603声明:

  

使用全局语句。使用“global”语句时使用   更新全局变量。 PyLint只是试图阻止这种用法。   这并不意味着你不能使用它!

我想知道为什么会这样?是否有更多Pythonic方法在函数内修改不可变的模块范围变量?是否建议将它们打包在像字典这样的可变变量中?或者可能将整个模块变成课堂?

在我看来,当建议变量为“私有”(以_或__为前缀)时,此警告应该消失。

3 个答案:

答案 0 :(得分:21)

全局变量的广泛使用会使维护成为一场噩梦,因为它们会跟踪程序的流程,有时会出现奇怪的错误,因为某些模块已经读取变量并在其他模块更改值之前对其值起作用变量(这可能是由于在某些不相关的第3个模块中反转了两个import语句)。另请参阅the wikipedia entry on Global variables

这就是为什么你应该避免可变的全局变量,IMO以及Pylint发出警告的原因(并且可能应该发出更多的警告。检测global关键字的使用只是一种简单的方法来发现一些他们)。

不要误解我的意思:我不是说你不能使用全局变量。只有你应该避免使用它们。 Python中有很多关于全局变量的合法案例。只要你没有超过几个W0603,你应该好。

现在,Logilab(维护Pylint的公司,以及我以前工作的地方)曾经不得不接管一块>的维护。 50kloc的Python代码,具有大量重复和100多个可变全局变量。这真是地狱。

解决全局变量的解决方案包括:

  • 向需要访问变量的函数添加参数
  • 使用类属性
  • 使用实例属性(通过将所需的值传递给类的构造函数)
  • 在构建的Configuration对象中集中可变全局值,以便在程序启动时(使用环境变量,命令行,配置文件...)实例化一次,并且在此之后永远不会发生变异。

答案 1 :(得分:6)

我会替换它:

the_file = None

def open_the_file(fname):
    global the_file
    the_file = open(fname)

def write_to_the_file(data):
    the_file.write(data)

open_the_file("boo")
write_to_the_file("Hi!")

用这个:

class FileProgram(object):
    def __init__(self):
        self.the_file = None

    def open_the_file(fname):
        self.the_file = open(fname)

    def write_to_the_file(data):
        self.the_file.write(data)

if __name__ == "__main__":
    prog = FileProgram()
    prog.open_the_file("boo")
    prog.write_to_the_file("Hi!")

你可能会说,“这对我的简单任务来说太复杂了!”好的,那就不要在你的程序上运行pylint了。你不能要求pylint明白你的程序太小而不能使用良好的结构。

答案 2 :(得分:0)

在python中,像这样共享全局数据的模块几乎是一个单例。你可以用singleton课来完成同样的事情,或者问自己是否有任何理由你实际上需要一个单身人士。如果您不需要单身人士 - 请使用常规课程(实例)。如果您需要单身人士,请谷歌/搜索以确定您认为哪种模式最适合您。也许你确实想要一个模块 - global有一个利基 - 否则Guido会在很久以前把它从语言中删除 - 那个利基恰好很小......