Короткая версияУсловный оператор __debug__ не выполняется, хотя __debug__ это правда
У меня есть часть кода, я отладки, который проверяет значение __debug__
и выполняет код, если это правда.
if __debug__:
<stuff happens>
Проблема заключается в том, что «материал» никогда не бывает, даже если __debug__
появляется, чтобы быть правдой.
Long Version/Детали
Чтобы проверить это, я распечатывание значения нескольких переменных, наиболее особенно __debug__
, в файл, как функция выполняется, используя следующую схему. (Я использую os.open
потому что open
уже определено в этом модуле.)
try:
myfile = os.open("test.txt", os.O_RDWR|os.O_CREAT|os.O_APPEND)
# work + some print statements to check the value of __DEBUG__
finally:
os.close(myfile)
Кусок кода я больше всего смущают выглядит следующим образом:
os.write(myfile, "LINE %s | LDAP FUNCTION __DEBUG__: %s \n" %(sys._getframe(0).f_lineno, __debug__))
os.write(myfile, "LINE %s | LDAP FUNCTION __DEBUG__: %s \n" %(sys._getframe(0).f_lineno, type(__debug__)))
os.write(myfile, "LINE %s | LDAP FUNCTION __DEBUG__: %s \n" %(sys._getframe(0).f_lineno, bool(__debug__)))
if __debug__:
os.write(myfile, "LINE %s | LDAP FUNCTION __DEBUG__: %s \n" %(sys._getframe(0).f_lineno, __debug__))
if bool(__debug__):
os.write(myfile, "LINE %s | LDAP FUNCTION __DEBUG__: %s \n" %(sys._getframe(0).f_lineno, __debug__))
if True:
os.write(myfile, "LINE %s | LDAP FUNCTION __DEBUG__: %s \n" %(sys._getframe(0).f_lineno, __debug__))
if __debug__:
os.write(myfile, "LINE %s | LDAP FUNCTION __DEBUG__: %s \n" %(sys._getframe(0).f_lineno, __debug__))
И выходной файл выглядит следующим образом :
LINE 82 | LDAP FUNCTION __DEBUG__: True
LINE 83 | LDAP FUNCTION __DEBUG__: <type 'bool'>
LINE 84 | LDAP FUNCTION __DEBUG__: True
LINE 88 | LDAP FUNCTION __DEBUG__: True
LINE 90 | LDAP FUNCTION __DEBUG__: True
первое 3 заявление (строки 82-84) является каждым способом, которым я мог думать о проверке, если __debug__
является «truthy», и все 3 означают, что __debug__
- правда. Аналогично, кастинг __debug__
как булево, а затем оценка if
(строка 88) также работает так же, как ожидалось. Строка 90 - глупая проверка здравомыслия.
Есть ли что-то, что мне не хватает на пути __debug__
работ, которые могут быть причиной этого?
Примечание: Я нашел это в то время я работал за ошибки я получаю в функции _ldap_function_call
в python-ldap
модуле. Я получаю эту ошибку только при использовании IIS - все отлично работает с сервером разработки Django.
Какая версия Python это? В версиях 2.7 и 3.x присвоение '__debug__' является' SyntaxError'; в более ранних версиях 2.x '__debug__' не был волшебной константой, но в версии 2.6 и несколькими версиями до этого (не уверен, сколько), это волшебная константа, но вы можете переписать это имя на что-то еще, что приводит к странности. – abarnert
Возможно, это вызвано чем-то странным: я подозреваю файлы .pyc/.pyo. Удаляет ли какой-либо файл .pyc/.pyo, чтобы решить проблему? –
@abarnert: Ах. Но странность все еще возможна: http://bpaste.net/show/82378/. turtlemonvh: либо ваш код mangle '__debug__' таким образом, либо, скорее всего, код контекста (python-ldap?). –