Python 全局关键字与 Pylint W0603

新手上路,请多包涵

Pylint W0603 指出:

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

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

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

原文由 Jovik 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 983
2 个回答

全局变量的广泛使用会使维护成为一场噩梦,因为它们会跟踪程序的流程,有时您会遇到奇怪的错误,因为某些模块已经读取变量并在其他模块更改变量值之前对其值进行操作(这可能是由于在一些不相关的第三个模块中反转两个导入语句造成的)。另请参阅 有关全局变量的维基百科条目

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

不要误会我的意思:我并不是说您不能使用全局变量。只有你应该避免使用它们。 Python 中有很多全局变量的合法案例。只要你得到的不超过一对 W0603,你应该过得很好。

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

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

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

原文由 gurney alex 发布,翻译遵循 CC BY-SA 3.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 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题