Python: Могу ли я перегружать оператор повышения с def __raise __ (self) :?
Вопрос
Вот мой класс исключения, который использует поднимать:
class SCE(Exception):
"""
An error while performing SCE functions.
"""
def __init__(self, value=None):
"""
Message: A string message or an iterable of strings.
"""
if value is None:
self._values = []
elif isinstance(value, str):
self._values = [value]
else:
self._values = list(value)
def __raise__(self):
print('raising')
if not len(self._values):
return
def __str__(self):
return self.__repr__()
def __iter__(self):
return iter(self._values)
def __repr__(self):
return repr(self._values)
В настоящее время, если я подразумею это исключение без значения, которое я получаю Traysback после:
__main__.SCE: []
Вместо того, что я ожидал, что было:
raising
>>>
Как вы перегружены raise
?
Решение
Как говорит другой ответ, нет __raise__
Специальный метод. В 2004 году на COMP.LANG.PYPHON был нить поток. Единственный способ, которым я могу подумать о повышении исключения для зацепления, является либо путем исправления переводчика или некоторого исходного или банкнота байткода, который вставляет функциональный вызов рядом с операцией повышения.
Другие советы
Такого специального метода нет __raise__
(по крайней мере, не что я когда-либо слышал, или что я могу найти в Документация Python).
почему ты хочешь сделать это? Я не могу подумать по какой-либо причине, по которой вы хотите выполнить пользовательский код, когда исключение поднимается (в отличие от того, когда это построено исключение, которое вы можете сделать с __init__
метод или когда исключение поймано, что вы можете сделать с помощью except
блокировать). Каково ваше использование для этого поведения, и почему вы ожидаете, что Python поддерживает его?
Как сформулированы другие, такого частного метода нет __raise__
. Отказ Ничто не мешает определять одно. Например:
#!/usr/bin/env python3
class MyClass(object):
def __init__(self, raise_exceptions=False):
self.raise_exceptions = raise_exceptions
def __raise__(self, err=None):
print(err, flush=True)
if self.raise_exceptions:
raise err
def run(self):
try:
assert False, 'assertion False'
except Exception as err:
self.__raise__(err)
if __name__ == '__main__':
MyClass(raise_exceptions=False).run()
MyClass(raise_exceptions=True).run()
Вот выход:
$ python3 my_class.py
assertion False
assertion False
Traceback (most recent call last):
File "my_class.py", line 22, in <module>
MyClass(raise_exceptions=True).run()
File "my_class.py", line 17, in run
self.__raise__(err)
File "my_class.py", line 11, in __raise__
raise err
File "my_class.py", line 15, in run
assert False, 'assertion False'
AssertionError: assertion False
Process finished with exit code 1