Непустые строки являются правдивыми, но не обязательно эквивалентны true
.
==
является «мягким» оператором равенства. Он использует принуждение типа, чтобы сравнить два эквивалентных объекта как равные.
Все следующее верно:
42 == "42"
0 == false
0 == ""
[] == ""
{} == "[object Object]"
"1" == true
Аргументные строки не эквивалентны никаким примитивным значениям. Однако
Когда вы пишете if (something)
, if
будет выполняться, если something
является «правдивым».
Все значения правдивы, кроме следующих:
false
0
NaN
""
null
undefined
Некоторые другие ответы уже указали на модуль traceback .
Обратите внимание, что при использовании print_exc
в некоторых угловых случаях вы не получите того, чего ожидаете. В Python 2.x:
import traceback
try:
raise TypeError("Oups!")
except Exception, err:
try:
raise TypeError("Again !?!")
except:
pass
traceback.print_exc()
... будет отображать трассировку последнего исключения :
Traceback (most recent call last):
File "e.py", line 7, in <module>
raise TypeError("Again !?!")
TypeError: Again !?!
Если вам действительно нужно получить доступ к исходному traceback . Одним из решений является кэширование информации об исключении , возвращенной из exc_info
, в локальную переменную и отображение ее с помощью print_exception
:
import traceback
import sys
try:
raise TypeError("Oups!")
except Exception, err:
try:
exc_info = sys.exc_info()
# do you usefull stuff here
# (potentially raising an exception)
try:
raise TypeError("Again !?!")
except:
pass
# end of useful stuff
finally:
# Display the *original* exception
traceback.print_exception(*exc_info)
del exc_info
Производство:
Traceback (most recent call last):
File "t.py", line 6, in <module>
raise TypeError("Oups!")
TypeError: Oups!
Несколько ловушек с этим, хотя:
Из документа sys_info
:
Присвоение возвращаемого значения traceback локальной переменной в функции, которая обрабатывает исключение, вызовет циклическую ссылку . Это предотвратит сбор мусора, на который ссылается локальная переменная в той же функции или трассировка. [...] Если вам нужна трассировка, обязательно удалите ее после использования (лучше всего делать с помощью оператора try ... finally)
, но из того же документа:
Начиная с Python 2.2, такие циклы автоматически восстанавливаются , когда сборка мусора включена и становится недоступной, но она остается более эффективной для избегайте создания циклов.
С другой стороны, предоставляя вам доступ к трассировке , связанной с исключением, Python 3 дает менее удивительный результат:
import traceback
try:
raise TypeError("Oups!")
except Exception as err:
try:
raise TypeError("Again !?!")
except:
pass
traceback.print_tb(err.__traceback__)
... будет отображаться:
File "e3.py", line 4, in <module>
raise TypeError("Oups!")