flake8: F821 全局变量的未定义名称

flake8: F821 undefined name for a global variable

我已经编辑了我的脚本以删除除一个警告之外的所有 flake8 警告:

/tmp/flake8.tempfile.py:535:26: F821 undefined name 'salt'

/tmp/flake8.tempfile.py:536:29: F821 undefined name 'salt'

/tmp/flake8.tempfile.py:554:22: F821 undefined name 'salt'

/tmp/flake8.tempfile.py:602:21: F821 undefined name 'salt'

/tmp/flake8.tempfile.py:602:32: F821 undefined name 'salt'

/tmp/flake8.tempfile.py:609:21: F821 undefined name 'salt'

/tmp/flake8.tempfile.py:609:32: F821 undefined name 'salt'

/tmp/flake8.tempfile.py:623:44: F821 undefined name 'salt'

/tmp/flake8.tempfile.py:646:39: F821 undefined name 'salt'

/tmp/flake8.tempfile.py:651:39: F821 undefined name 'salt'

/tmp/flake8.tempfile.py:654:39: F821 undefined name 'salt'

...

salt 是一个被许多函数使用的 hashlib 对象。它在脚本的主要部分(底部)中用以下行定义:

salt = hashlib.sha512() 

更新数据之前。我的所有其他全局变量都工作正常,所以我不知道为什么这个会使 flake8 剥落。

如果您有像

这样的文件
# file_a.py
import hashlib

def my_func():

   ...

   if salt == ... :
      ...

if __name__ == '__main__':
    salt = hashlib.sha512() 
    my_func()

那么在调用 python file_a.py 时它会 运行 就好了,但是语法检查器会抛出警告,因为 salt 可能没有被定义。

例如,如果您在同一个文件夹中创建另一个文件,例如

# file_b.py
from file_a import my_func()

那么你最终会得到 salt 没有被定义,因为 if __name__ == '__main__': 中的部分没有被调用,因为 file_a.py 不是 "main" 文件。

如果你想定义一个常量,那么你需要在外部定义它——最好在文件的顶部:

# file_a.py
import hashlib

SALT = hashlib.sha512() 

def my_func():

   ...

   if SALT == ... :
      ...

if __name__ == '__main__':
    my_func()

但最有可能的是,最好避免常量并改用关键字参数。

我希望这就是正在发生的事情。如果我完全离开了,那么我很抱歉,但在那种情况下你需要提供更多的代码,这非常像这样的猜谜游戏:)

我将文件的整个主要部分包装在一个文件中:

if __name__ == "__main__":

问题神奇地消失了。没有解释为什么,但至少有一天这可能会帮助其他人解决同样的问题。