gpt4 book ai didi

enums - 在 cython 中包装 typedefed 枚举

转载 作者:行者123 更新时间:2023-12-04 11:31:21 25 4
gpt4 key购买 nike

我想在 cython 中包装以下代码:

enum Status {GOOD, BAD};

typedef enum Status STATUS;
// note that the typedef means people dont
// have to write `enum Status` everywhere

// just returns `GOOD`
STATUS hello();

我在 c_library.pxd 中编写了以下 cython 代码:
cdef extern from "library.h":

cpdef enum Status:
GOOD,
BAD

ctypedef Status STATUS

cpdef STATUS hello()

模块 c_library现在包含 c_library.GOOD , c_library.BAD ,
c_library.Status ,其行为类似于 enum .然而
函数调用的返回值 hello返回一个普通的 int:
>>> c_library.hello()
0
>>> type(c_library.hello())
<class 'int'>

我希望结果也包含在相同类型的枚举中。
我可以更改 cython 文件,但不能更改底层 C 代码。那可能吗?

最佳答案

这看起来像是 Cython 的一个小问题(小错误?),它决定使用 __Pyx_PyInt_From_enum__包装时出于某些原因 cdef -函数变成def功能。

作为一个快速的解决方法,我可以建议明确创建一个 Status -枚举:

%%cython
cdef extern from *:
"""
typedef enum Status {GOOD, BAD} Status;

// just returns `GOOD`
Status hello() {return GOOD;}
"""
cpdef enum Status:
GOOD,
BAD

Status c_hello "hello"()

def hello():
return Status(c_hello())

现在:
>>> type(hello())
<enum 'Status'>

可能值得注意的事情:
  • verbatim C-code用于使示例自包含。
  • 使用 typedef enum X {...} X;将枚举的类型名称从枚举的 namespace 拉入普通变量的 namespace 是一种常见做法(但显然这是一个品味问题,所以如果您更喜欢 STATUS - 这取决于您)。请参阅 C11 标准中关于不同 namespace 的措辞 here或此 great answer (即使是关于 struct )。
  • cname -trick(即 Status c_hello "hello"() )用于添加一个间接级别并保持模块的公共(public)接口(interface)完整(即 cpdef hello() )。
  • 但是,当使用 hello 时如 cdef -function 我可能会使用 c_hello避免创建枚举的开销 - 这就是原因 hello()定义为 def -function,所以没有混淆。
  • 关于enums - 在 cython 中包装 typedefed 枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54047125/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com