Сторонняя библиотека (написанная на языке C), которую я использую в моем коде на Python, выдает предупреждения. Я хочу иметь возможность использовать синтаксис try
except
для правильной обработки этих предупреждений. Есть ли способ сделать это?
В Python, как вы улавливаете предупреждения, как если бы они были исключениями?
Ответ 1
Чтобы процитировать из справочника python (27.6.4. Тестирование предупреждений):
import warnings
def fxn():
warnings.warn("deprecated", DeprecationWarning)
with warnings.catch_warnings(record=True) as w:
# Cause all warnings to always be triggered.
warnings.simplefilter("always")
# Trigger a warning.
fxn()
# Verify some things
assert len(w) == 1
assert issubclass(w[-1].category, DeprecationWarning)
assert "deprecated" in str(w[-1].message)
(править: фиксированный пример, был отключен раздел)
Ответ 2
Чтобы обрабатывать предупреждения как ошибки, просто используйте это:
import warnings
warnings.filterwarnings("error")
После этого вы сможете поймать предупреждения так же, как и ошибки, например. это будет работать:
try:
some_heavy_calculations()
except RuntimeWarning:
import ipdb; ipdb.set_trace()
P.S. Добавлен этот ответ, потому что лучший ответ в комментариях содержит орфографию: filterwarnigns
вместо filterwarnings
.
Ответ 3
Здесь приведена вариация, позволяющая уточнить, как работать только с вашими пользовательскими предупреждениями.
import warnings
with warnings.catch_warnings(record=True) as w:
# Cause all warnings to always be triggered.
warnings.simplefilter("always")
# Call some code that triggers a custom warning.
functionThatRaisesWarning()
# ignore any non-custom warnings that may be in the list
w = filter(lambda i: issubclass(i.category, UserWarning), w)
if len(w):
# do something with the first warning
email_admins(w[0].message)
Ответ 4
Если вы просто хотите, чтобы вы script отказались от предупреждений, вы можете использовать:
python -W error foobar.py