Python 全局关键字与 Pylint W0603

标签 python global-variables global pylint

Pylint W0603 指出:

Using the global statement. Used when you use the "global" statement to update a global variable. PyLint just try to discourage this usage. That doesn't mean you can not use it !

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

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

最佳答案

全局变量的普遍使用会使维护成为一场噩梦,因为它们会跟踪程序的流程,有时您会遇到奇怪的错误,因为某些模块已经读取变量并在其他模块更改值之前对其值进行操作变量的(这可能是由于在一些不相关的第三个模块中反转两个 import 语句造成的)。另见 the wikipedia entry on Global variables .

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

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

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

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

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

关于Python 全局关键字与 Pylint W0603,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14503973/

相关文章:

python - 使用递归函数时处理python全局变量

swift - 为什么我不能在 swift 中使用一个全局变量作为另一个全局变量定义的一部分?

javascript - Javascript 和 ESLint 中的全局变量

javascript - 如何将 javascript 函数锁定到本地范围?我想阻止它使用全局变量

python - Pandas +群

java - 热切初始化与延迟初始化用例

python - 使用端口安装numpy(Python默认版本问题)

php - CodeIgniter - 声明全局变量的最佳位置

python - Tf-Idf 值是如何用分析器 ='char' 计算出来的?

python - 写入文件夹时文件更改