2014-10-09 2 views
0

У меня очень странная проблема со скриптом, который имеет следующую структуру:импортирован модуль случайным образом значение Нет

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 ...

+0

Да, глобалы - это почти единственный способ, которым это может случиться. FWIW, если в другом модуле _imports_ этот модуль, они также могут обезопасить свои глобальные значения, чтобы установить 'os' и' function_one' в 'None' ... – mgilson

+0

Вы получаете этот эффект, когда CPython выключается: он заменяет глобальные значения None для некоторых (в основном исторической). Являются ли функции, вызванные методами '__del__', которые запускаются при выключении интерпретатора? –

+0

Какую версию Python вы используете? Есть ли код, присваивающий этим именам «Нет»? Можете ли вы показать больше кода? – l04m33

ответ

0

Если у вас был другой модуль в вашем PYTHONPATH с именем os, он мог бы импортироваться вместо него. Как упоминалось в комментариях, другой модуль может также быть обезглавливанием модуля os, либо в sys.modules, либо путем импорта вашего модуля.