Я отредактировал свой скрипт, чтобы удалить все предупреждения 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.sha512()
Перед обновлением данных. Все другие мои глобальные переменные работают нормально, поэтому я не знаю, почему этот делает flake8 отслаивающимся.
Это не модуль. Это основной файл, который запускается напрямую.
Я объяснил в ответе ниже, что я догадывался, что происходит.
Большое спасибо за ответ, но я поместил весь основной раздел в «if имя == «основной»:», и проблема волшебным образом исчезла. Ну что ж.
Если у вас есть файл типа
# 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()
но, скорее всего, было бы лучше избегать констант и вместо этого использовать аргументы ключевого слова.
Я надеюсь, что это то, что происходит. Если я совсем не прав, то прошу прощения, но в этом случае вам нужно будет предоставить больше кода, это очень похоже на игру в угадайку :)
Я завернул весь основной раздел файла в:
if __name__ == "__main__":
и проблема волшебным образом ушла. Нет объяснения, почему, но, по крайней мере, это может когда-нибудь помочь кому-то еще с той же проблемой.
но если
salt
определен внутриif __name__ == '__main__':
и вы импортируете свой модуль из другого скрипта (чтобы__main__
-вещи не выполнялись), будет ли место, гдеsalt
не определено?