我正在使用cffi
.
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
第一条路径有点麻烦,因为它要求用户始终创建一个除了管理库状态之外没有其他目的的对象。另一方面,它确保terminate()
每次都实际调用它。
第二条路径似乎会导致 API 更简单一些。然而,它暴露了一些隐藏的全局状态,这可能是一件坏事。此外,如果用户忘记调用terminate()
,C 库没有正确卸载(这在 C 端不是一个大问题)。
这些路径中的哪一个更符合 Python 风格?