Pylint W0603 指出:
使用全局语句。 当您使用“全局”语句更新全局变量时使用。 PyLint 只是试图阻止这种用法。这并不意味着你不能使用它!
我想知道为什么会这样?有没有更多的 Pythonic 方法来修改函数内不可变的、模块范围的变量?是否建议将它们打包在字典等可变变量中?或者也许将整个模块变成类?
在我看来,当变量被建议为“私有”(以 _ 或 __ 为前缀)时,这个警告应该消失。
原文由 Jovik 发布,翻译遵循 CC BY-SA 4.0 许可协议
Pylint W0603 指出:
使用全局语句。 当您使用“全局”语句更新全局变量时使用。 PyLint 只是试图阻止这种用法。这并不意味着你不能使用它!
我想知道为什么会这样?有没有更多的 Pythonic 方法来修改函数内不可变的、模块范围的变量?是否建议将它们打包在字典等可变变量中?或者也许将整个模块变成类?
在我看来,当变量被建议为“私有”(以 _ 或 __ 为前缀)时,这个警告应该消失。
原文由 Jovik 发布,翻译遵循 CC BY-SA 4.0 许可协议
我会替换这个:
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 理解你的程序太小而不能使用好的结构。
原文由 Ned Batchelder 发布,翻译遵循 CC BY-SA 3.0 许可协议
2 回答5.1k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
4 回答1.4k 阅读✓ 已解决
4 回答2.7k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
3 回答1.2k 阅读✓ 已解决
1 回答1.7k 阅读✓ 已解决
全局变量的广泛使用会使维护成为一场噩梦,因为它们会跟踪程序的流程,有时您会遇到奇怪的错误,因为某些模块已经读取变量并在其他模块更改变量值之前对其值进行操作(这可能是由于在一些不相关的第三个模块中反转两个导入语句造成的)。另请参阅 有关全局变量的维基百科条目。
这就是为什么你应该避免可变全局变量,IMO,以及为什么 Pylint 发出警告(并且可能应该发出更多警告。检测
global
关键字的使用只是发现其中一些的简单方法).不要误会我的意思:我并不是说您不能使用全局变量。只有你应该避免使用它们。 Python 中有很多全局变量的合法案例。只要你得到的不超过一对 W0603,你应该过得很好。
现在,Logilab(维护 Pylint 的公司,也是我以前工作的地方)曾经不得不接手维护一段 > 50kloc 的 Python 代码,其中有大量重复和 100 多个可变全局变量。这就是地狱。
解决全局变量的解决方案包括: