Почему бы не вызывать метод `__del__` после любой ошибки? - PullRequest
1 голос
/ 17 июня 2020

Я нахожу шаблон удаления объекта для python.
Я нашел какой-то шаблон и написал этот тестовый код;

class test:
     def __init__(self, *args, **kwargs):
         print("test.__init__(self, *args={}, **kwargs={})".format(args, kwargs))
     def __enter__(self, *args, **kwargs):
         print("test.__enter__(self, *args={}, **kwargs={})".format(args, kwargs))
     def __exit__(self, *args, **kwargs):
         print("test.__exit__(self, *args={}, **kwargs={})".format(args, kwargs))
     def __del__(self, *args, **kwargs):
         print("test.__del__(self, *args={}, **kwargs={})".format(args, kwargs))
     def example(self, *args, **kwargs):
         print("test.example(self, *args={}, **kwargs={}".format(args, kwargs))
         if("error" in kwargs):
             raise Exception(kwargs["error"])

Я пробую этот метод истинного вызова __del__.

t = test()
t.example(1, 2, 3, message="test")
t = None

результат;

test.__init__(self, *args=(), **kwargs={})
test.example(self, *args=(1, 2, 3), **kwargs={'message': 'test'})
test.__del__(self, *args=(), **kwargs={}) ## Ok. I can see calling __del__ method

Но этот тест после не вызывает __del__

t = test()
t.example(1, 2, 3, error="some error")
t = None

результат;

test.__init__(self, *args=(), **kwargs={})
t.example(1, 2, 3, error="some error")
test.example(self, *args=(1, 2, 3), **kwargs={'error': 'some error'}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 13, in example
Exception: some error
t = None
# Opss ! Not calling __del__ method

Если какая-то ошибка возникла после того, как не позвонил __del___ Почему?

...