我正在爲使用cffi
的C庫編寫一個Python包裝器。Python模塊中的全局狀態
C庫必須被初始化並關閉。另外,cffi
需要一些地方來保存從ffi.dlopen()
返回的狀態。
我可以看到兩個路徑在這裏:
要麼我把這個包整個狀態的企業在一類這樣的
class wrapper(object):
def __init__(self):
self.c = ffi.dlopen("mylibrary")
self.c.initialize()
def __del__(self):
self.c.terminate()
或者我提供了隱藏在一個全局變量的狀態兩個全局函數
def initialize():
global __library
__library = ffi.dlopen("mylibrary")
__library.initialize()
def terminate():
__library.terminate()
del __library
第一個路徑有點麻煩,因爲它要求用戶總是創建一個對象,除了管理lib拉里狀態。另一方面,它確保每次都調用terminate()
。
第二條路徑似乎導致了一個更簡單的API。但是,它暴露了一些隱藏的全球狀態,這可能是一件壞事。另外,如果用戶忘記調用terminate()
,C庫不能正確卸載(這在C方面並不是很大的問題)。
這些路徑中哪一個會變得更加pythonic?
任何原因導致模塊不僅僅是初始化庫(並在模塊全局變量中存儲必要的引用)? – kindall
@kindall然後我會怎麼調用terminate()呢? – bastibe
你說這沒有什麼大不了的。但是如果需要調用,那麼唯一可行的方法是讓庫的用戶調用它。反正你不能指望'__del__'。上下文管理器可能有意義,但是... – kindall