1

基本的に、私はPythonでC APIをラップしています(CFFIを使用しています(これは素晴らしいです))。

私はそのC APIに列挙型を持っています:

typedef enum
{
    enum1 = value1;
    enum2 = value2;
    ...
} enumSomething;

Python では、その列挙にある変数の名前を文字列 : として受け取ります"enum1"。頂きたいですvalue1

を使用CFFIすると、列挙型をラップしてそのメンバーに簡単にアクセスできます (ここに例があります)。ここでの問題は、変数自体ではなく、変数の名前を表す文字列があることです。

したがって、cwrapper.c."enum1"機能しません (cwrapperラップするモジュールの名前であり、ライブラリのラップ中 cに返される名前です)。ffi.dlopen(libname)

次のように、変数名を文字列として実際の変数にマップする辞書を作成できます。

enum = { "enum1" : cwrapper.c.enum1, "enum2" : cwrapper.c.enum2, ... } 

しかし、この時点で、enum を Python 辞書として書き直したほうがよいでしょう。

正規表現を使用して C ファイルを読み取ることもできますが、それを処理するためのより良い方法がまだあると思います。何か案が?

4

2 に答える 2

3

cwrapper.c."enum1"一般に、Python では有効な構文ではありません。使用する必要がありますgetattr

>>> getattr(cwrapper.c, "enum1")
42

ただし、よりクリーンなアプローチは、を使用して実際の型を取得することtypeofです。次にrelements、辞書である を取得します。

>>> import cffi
>>> ffi = cffi.FFI()
>>> ffi.cdef('typedef enum {RANDOM, IMMEDIATE, SEARCH} strategy;')
>>> typeof_strategy = ffi.typeof('strategy')
>>> typeof_strategy.relements
{'RANDOM': 0, 'SEARCH': 2, 'IMMEDIATE': 1}
>>> typeof_strategy.relements['SEARCH']
2
于 2016-05-12T15:26:06.043 に答える