【发布时间】:2013-06-27 14:51:02
【问题描述】:
我正在使用cffi 为 C 库编写 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
第一个路径有点麻烦,因为它要求用户始终创建一个除了管理库状态之外没有其他目的的对象。另一方面,它确保每次都实际调用terminate()。
第二条路径似乎导致 API 更简单一些。然而,它暴露了一些隐藏的全局状态,这可能是一件坏事。另外,如果用户忘记调用terminate(),C 库没有正确卸载(这在C 端不是什么大问题)。
这些路径中哪一条更符合 Python 风格?
【问题讨论】:
-
有什么理由不只是在导入模块时初始化库(并将必要的引用存储在模块全局变量中)?
-
@kindall 那我怎么称呼
terminate()? -
你说如果不调用这没什么大不了的。但是如果它需要调用,那么可靠地做到这一点的唯一方法是让你的库的用户调用它。无论如何,你不能指望
__del__。不过,上下文管理器可能有意义...
标签: python module coding-style global-variables