Я только что обнаружил это странное поведение в области видимости как Python 2, так и 3. Когда я добавляю поздний импорт для подмодуля, основной импорт модуля toplevel перестает работать. Жизнеспособное пример:странное поведение позднего импорта и области видимости
import os
def start():
import sys
print('in modules?', 'os' in sys.modules)
print('in globals?', 'os' in globals())
print('in locals?', 'os' in locals())
print('os =', os)
import os.path
os.path.exists('useless statement')
start()
Выход будет:
in modules? True
in globals? True
in locals? False
Traceback (most recent call last):
File "test.py", line 15, in <module>
start()
File "test.py", line 9, in start
print('os =', os)
UnboundLocalError: local variable 'os' referenced before assignment
Любые идеи?
По той же причине, которую вы когда-либо получали, 'UnboundLocalError' -' import os.path' присваивает 'os' так же, как' os = 1'. И почему ваш импорт не находится в верхней части сценария? – jonrsharpe
@ jonrsharpe казалось странным, что 'os' из глобальной области не используется повторно * до того, как оно переопределено в локальной области. Кроме того, мой импорт импортирует библиотеки, которые можно безопасно импортировать только после форкирования. –
Так оно всегда работает; Python проверяет * последующие * назначения в области, чтобы гарантировать, что одно и то же имя не будет использоваться для двух разных вещей в одной области. – jonrsharpe