Как избежать явного вызова метода Dispose для объекта IDisposable в python через pythonnet?

Недавно я разработал динамический объект на C # (небольшую библиотеку сортировки), который я могу связать со своим приложением на python (извините, если я не прав в своей номенклатуре). У меня есть некоторый объект IDisposable, который открывает файл в конструкторе, а затем закрывает его в методе Dispose(). Файл должен оставаться открытым в течение всей жизни объекта.

Я ожидал бы, что метод Dispose() будет вызываться автоматически после последней живой ссылки, но вместо этого я должен вызывать его явно.

  • Python 3.7.3
  • Ubuntu 18.04.2
  • pythonnet 2.4.0
  • моно 5.18.1.28
import clr
clr.AddReference("MyLibrary")
from MyLibrary import DynamicObject

, а затем используйте его в моем коде:

def foo():
   my_obj = DynamicObject()
   ...
   my_obj().Dispose() # have to call it here
   return

Более того, финализатор также не вызывается. Есть ли способ использовать метод finalizer или Dispose() и не вызывать их явно, или сборщик мусора из CLR не имеет представления о том, что происходит в моем скрипте python? Как python взаимодействует через python.net?

Спасибо: -)

1
задан Proko 12 August 2019 в 10:20
поделиться

1 ответ

Dispose не становится названным автоматически. Это там так, чтобы безотносительно использования класс мог использовать его для избавления от неуправляемых ресурсов при необходимости. Финализатор будет называться автоматически, но это будет то, каждый раз, когда сборщик "мусора" решает сделать это, а не сразу после того, как экземпляр выходит из объема.

, Если Вы хотите сделать управление Вашим Dispose вызовы немного легче, можно посмотреть оператор использования, который поддерживается with в Python .

1
ответ дан 3 September 2019 в 01:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: