Flake8: F821 неопределенное имя для глобальной переменной

Я отредактировал свой скрипт, чтобы удалить все предупреждения 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 отслаивающимся.

но если salt определен внутри if __name__ == '__main__': и вы импортируете свой модуль из другого скрипта (чтобы __main__-вещи не выполнялись), будет ли место, где salt не определено?

Snow bunting 30.05.2019 17:52

Это не модуль. Это основной файл, который запускается напрямую.

SurpriseDog 30.05.2019 20:00

Я объяснил в ответе ниже, что я догадывался, что происходит.

Snow bunting 30.05.2019 22:26

Большое спасибо за ответ, но я поместил весь основной раздел в «if имя == «основной»:», и проблема волшебным образом исчезла. Ну что ж.

SurpriseDog 31.05.2019 01:02
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
2 656
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если у вас есть файл типа

# 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__":

и проблема волшебным образом ушла. Нет объяснения, почему, но, по крайней мере, это может когда-нибудь помочь кому-то еще с той же проблемой.

Другие вопросы по теме