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

时间:2019-05-29 22:24:04

标签: python-3.x pep8 flake8

我已经编辑了脚本,以删除除以下之一以外的所有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掉落。

2 个答案:

答案 0 :(得分:0)

如果您有

之类的文件
# 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内的部分未被调用。

如果要定义常量,则需要在外部定义-最好在文件顶部:

# file_a.py
import hashlib

SALT = hashlib.sha512() 

def my_func():

   ...

   if SALT == ... :
      ...

if __name__ == '__main__':
    my_func()

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

我希望这是正在发生的事情。如果我完全不赞成,那么我表示歉意,但是在那种情况下,您将需要提供更多代码,这非常像一个猜谜游戏:)

答案 1 :(得分:0)

我将文件的整个主要部分包裹在一个

中:
if __name__ == "__main__":

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