【问题标题】:flake8: F821 undefined name for a global variableflake8: F821 全局变量的未定义名称
【发布时间】:2019-10-15 13:58:29
【问题描述】:

我已经编辑了我的脚本以删除所有 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 脱落。

【问题讨论】:

  • 但是如果salt 在if __name__ == '__main__': 中定义并且你从另一个脚本导入你的模块(这样__main__-stuff 不会被执行),会有一个地方salt未定义?
  • 这不是一个模块。这是直接运行的主文件。
  • 我在下面的答案中解释了我猜发生了什么。
  • 非常感谢您的回复,但我将整个主要部分放在“if name == "main":" 中,问题神奇地出现了离开了。哦,好吧。

标签: python-3.x pep8 flake8


【解决方案1】:

如果你有类似的文件

# 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()

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

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

【讨论】:

    【解决方案2】:

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

    if __name__ == "__main__":
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-21
      • 1970-01-01
      • 2018-05-04
      • 2015-12-22
      • 2014-04-18
      • 2015-08-08
      • 2011-04-27
      相关资源
      最近更新 更多