У меня очень странная проблема со скриптом, который имеет следующую структуру:импортирован модуль случайным образом значение Нет
import os
# ... some functions
def function_one():
...
def function_two():
if os.path.isdir(...):
Последнее утверждение иногда терпит неудачу с NoneType has no attribute 'path'
, и случайно я обнаружил, что modfied версия function_two
def function_two():
if os is None:
print function_one
принт None
. Таким образом, не только os
- None
, но function_one
- None
тоже.
Я хочу воспроизвести ошибку, но не знаю, где искать причину, у меня нет глобальных переменных, и я не изменяю sys.modules
.
У кого-нибудь есть идеи, как os
может стать None
? Я не смог имитировать это без использования глобальных переменных с именами os
и function_one
...
Да, глобалы - это почти единственный способ, которым это может случиться. FWIW, если в другом модуле _imports_ этот модуль, они также могут обезопасить свои глобальные значения, чтобы установить 'os' и' function_one' в 'None' ... – mgilson
Вы получаете этот эффект, когда CPython выключается: он заменяет глобальные значения None для некоторых (в основном исторической). Являются ли функции, вызванные методами '__del__', которые запускаются при выключении интерпретатора? –
Какую версию Python вы используете? Есть ли код, присваивающий этим именам «Нет»? Можете ли вы показать больше кода? – l04m33