Pylint W0603声明:
使用全局语句。使用“global”语句时使用 更新全局变量。 PyLint只是试图阻止这种用法。 这并不意味着你不能使用它!
我想知道为什么会这样?是否有更多Pythonic方法在函数内修改不可变的模块范围变量?是否建议将它们打包在像字典这样的可变变量中?或者可能将整个模块变成课堂?
在我看来,当建议变量为“私有”(以_或__为前缀)时,此警告应该消失。
答案 0 :(得分:21)
全局变量的广泛使用会使维护成为一场噩梦,因为它们会跟踪程序的流程,有时会出现奇怪的错误,因为某些模块已经读取变量并在其他模块更改值之前对其值起作用变量(这可能是由于在某些不相关的第3个模块中反转了两个import语句)。另请参阅the wikipedia entry on Global variables。
这就是为什么你应该避免可变的全局变量,IMO以及Pylint发出警告的原因(并且可能应该发出更多的警告。检测global
关键字的使用只是一种简单的方法来发现一些他们)。
不要误解我的意思:我不是说你不能使用全局变量。只有你应该避免使用它们。 Python中有很多关于全局变量的合法案例。只要你没有超过几个W0603,你应该好。
现在,Logilab(维护Pylint的公司,以及我以前工作的地方)曾经不得不接管一块>的维护。 50kloc的Python代码,具有大量重复和100多个可变全局变量。这真是地狱。
解决全局变量的解决方案包括:
答案 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会在很久以前把它从语言中删除 - 那个利基恰好很小......