簡體   English   中英

在Python中使用其名稱(Python字符串)在枚舉中獲取C變量值

[英]Fetching a C variable value in an enum using its name (a Python string) in Python

基本上,我在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, ... } 

但是在這一點上,我最好將枚舉重寫為Python字典。

我知道我也可以使用正則表達式來讀取C文件,但是我認為還有一種更好的處理方式,我沒有想到。 任何想法?

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

根據Antti的答案,可以構建適當的Python Enum

Strategy = enum.Enum('Strategy', ffi.typeof('strategy').relements)

list(Strategy)
# [<Strategy.RANDOM: 0>, <Strategy.IMMEDIATE: 1>, <Strategy.SEARCH: 2>]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM