6

を使用して C ライブラリの Python ラッパーを作成していcffiます。

C ライブラリを初期化してシャットダウンする必要があります。また、 はcffiから返された状態を保存する場所が必要ffi.dlopen()です。

ここには 2 つのパスがあります。

このステートフルなビジネス全体をこのようなクラスでラップするか

class wrapper(object):
    def __init__(self):
        self.c = ffi.dlopen("mylibrary")
        self.c.initialize()
    def __del__(self):
        self.c.terminate()

または、グローバル変数の状態を隠す 2 つのグローバル関数を提供します。

def initialize():
    global __library 
    __library = ffi.dlopen("mylibrary")
    __library.initialize()
def terminate():
    __library.terminate()
    del __library

最初の方法は、ライブラリの状態を管理する以外に実際には何の役にも立たないオブジェクトを常に作成する必要があるという点で、やや面倒です。一方、terminate()が実際に毎回呼び出されるようにします。

2 番目のパスでは、API がいくらか簡単になるようです。ただし、隠されたグローバルな状態が公開されるため、これは悪いことかもしれません。また、ユーザーが を呼び出すのを忘れた場合terminate()、C ライブラリは正しくアンロードされません (これは C 側では大きな問題ではありません)。

これらのパスのどれがよりpythonicになりますか?

4

1 に答える 1