Почему UnboundLocalError возникает при импорте внутри функции - PullRequest
0 голосов
/ 07 ноября 2019

По какой-то причине этот код выдает ошибку:

import os

def main():
    print(os.path.isfile('/bin/cat'))
    import os

if __name__ == '__main__':
    main()

Результат:

Traceback (most recent call last):
  File "test.py", line 10, in <module>
    main()
  File "test.py", line 5, in main
    print(os.path.isfile('/bin/cat'))
UnboundLocalError: local variable 'os' referenced before assignment

Почему это происходит? Обратите внимание, что в начале обоих случаев есть import os. Каким-то образом дополнительный импорт в конце тела функции влияет на всю область действия этой функции.

Если вы удалите импорт внутри функции, все в порядке (что неудивительно).

import os

def main():
    print(os.path.isfile('/bin/cat'))
    # import os

if __name__ == '__main__':
    main()

Результат:

True

О возможных дубликатах: Есть несколько похожих вопросов, но относительно глобальных переменных, а не импорта.

1 Ответ

1 голос
/ 07 ноября 2019

Если вы импортируете os в глобальной области видимости, вы создаете глобальную переменную с именем os. Если вы импортируете os в локальной области, вы создаете локальную переменную с именем os. И если вы попытаетесь использовать локальную переменную в функции до ее создания, вы получите эту ошибку. Так же, как если бы вы явно присваивали переменную.

Те же решения применимы, если вы хотите, чтобы импорт внутри функции создавал глобальную переменную, вы можете использовать ключевое слово global:

def main():
    global os
    print(os.path.isfile('/bin/cat'))
    import os

Или вы можете изменить свой локальный импорт, чтобы использовать другое имя переменной, чтобы использование os было однозначным.

def main():
    print(os.path.isfile('/bin/cat'))
    import os as _os

Хотя, очевидно, это всего лишь пример для демонстрации, и нет никаких причинв этом случае необходимо повторно импортировать os в вашу функцию, когда вы уже импортировали ее глобально.

...