Я пишу API рендеринга графики с классом «Материал», содержащим ресурсы, выделенные путем вызова функции «create_material» в моей C DLL, которая должна сопровождаться соответствующим вызовом «destroy_material».
/>Я хочу вызвать исключение, когда класс Material уничтожается/сборщик мусора без вызова Destroy_material, и я не могу найти надежный способ сделать это, особенно с учетом модульного тестирования.
Я попробовал это (self.handle — это c_void_p):
def __del__(self):
if self.handle.value:
raise ResourceNotDeallocated("Destroying material that was never destroyed on C side")
Но это крайне противоречиво из-за того, как на самом деле работают __del__ и GC, и я не смог протестировать его с помощью self.assertRaises(...) , даже после вызова gc.collect() он не будет поднят.
Я также пробовал подход слабого ref.finalize, но связанные методы Материала приводят к дополнительному количество ссылок, которое противоречит цели.
def __init__(self):
self._finalizer = weakref.finalize(self, self._on_finalize_material, self)
def _on_finalize_material(self):
if self.handle.value:
msg = f"Destroying material that was never destroyed on Remix side (Handle: {material.handle}, Albedo: {material.albedo_texture})"
raise ResourceNotDeallocated(msg)
Подробнее здесь: https://stackoverflow.com/questions/790 ... t-of-scope