在 cython 中包装类型定义的枚举

2024-03-26

我想将以下代码包装在 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();

我在中编写了以下 cython 代码c_library.pxd:

cdef extern from "library.h":

  cpdef enum Status:
    GOOD,
    BAD

  ctypedef Status STATUS

  cpdef STATUS hello()

该模块c_library现在包含c_library.GOOD, c_library.BAD, and c_library.Status,其行为类似于enum https://www.python.org/dev/peps/pep-0435/。但是,那 函数调用的返回值hello返回一个普通的 int:

>>> c_library.hello()
0
>>> type(c_library.hello())
<class 'int'>

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


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

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

%%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())

And now:

>>> type(hello())
<enum 'Status'>

可能值得注意的事情:

  • 逐字 C 代码 https://cython.readthedocs.io/en/latest/src/userguide/external_C_code.html#including-verbatim-c-code使用,使示例独立。
  • Using typedef enum X {...} X;将枚举的类型名称从枚举的名称空间拉入普通变量的名称空间是一种常见的做法(但显然这是一个品味问题,所以如果您愿意STATUS- 它是由你决定)。请参阅 C11 标准中关于不同名称空间的措辞here http://port70.net/~nsz/c/c11/n1570.html#6.2.3或这个很好的答案 https://stackoverflow.com/a/612350/5769463(即使是关于struct).
  • cname-技巧(即Status c_hello "hello"()使用 ) 是为了能够添加间接级别并保持模块的公共接口完整(即cpdef hello()).
  • 然而,当使用hello as cdef-我可能会使用的功能c_hello避免创建枚举的开销 - 这就是原因hello()被定义为def- 功能,所以不会造成混乱。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 cython 中包装类型定义的枚举 的相关文章

  • 是否可以从 Cucumber 功能文件中传递 Java-Enum 作为参数

    我目前正在将selenium与Java一起使用 并希望实现cucumber以使测试脚本更具可读性 目前在将参数传递给 java 方法时面临问题 其中 Enum 应该作为参数 我还想知道在迁移当前框架之前 cucumber java 是否还有
  • Python 中枚举的枚举?

    Python 中是否可以有枚举的枚举 例如 我想要 enumA enumB elementA elementB enumC elementC elementD 供我参考elementA as enumA enumB elementA 或参考
  • 如何在 Java 中定义重复的枚举常量?

    我想定义一个具有两个 值 相同的常量的枚举类型 我将这两个常量称为重复项 考虑以下示例 我想要定义一个浏览器类型列表 并且想要同时拥有文字 IE 和 InternetExplorer 如下所示 enum Browser CHROME chr
  • 枚举和字典<枚举,操作>

    我希望我能以每个人都清楚的方式解释我的问题 我们需要您对此的建议 我们有一个枚举类型 它定义了超过 15 个常量 我们收到来自 Web 服务的报告 并将其一列转换为此枚举类型 根据我们从该网络服务收到的信息 我们使用以下命令运行特定功能 字
  • 如何从值转换为枚举?

    我有一个看起来有点像这样的枚举 public enum Numbers ONE 1 TWO 2 THREE 3 public final int num public Numbers int num this num num 我希望能够从参
  • 最高序数枚举值

    我正在寻找从 bean 列表中的枚举属性列表计算最高序数枚举值 例如 我有 Data public class MyBean private Priority priority and public enum Priority URGENT
  • JPA 枚举 ORDINAL 与 STRING

    可以使用以下任一方式在 JPA 中定义枚举 Enumerated EnumType ORDINAL or Enumerated EnumType STRING 我想知道这两个定义的优点和缺点是什么 我听说 ORDINAL 在 Eclipse
  • 允许按位运算的通用约束?

    我有一个enum public enum Flags COMMAND MSG 1 COMMAND FILE 2 COMMAND ACTION 4 现在 假设我设置了多个值 例如 Flags g Flags COMMAND ACTION Fl
  • 比较枚举的最佳方法[重复]

    这个问题在这里已经有答案了 例如 我有一个枚举enum Color Red Brown 我还有一些该类型的变量 Color c1 Brown c2 Red 与恒定值进行比较的最佳方法是什么 if c1 Color Brown is brow
  • 是否可以将作用域枚举(“枚举类”)根据上下文转换为布尔值?

    假设我有 enum class Flags std uint16 t None 0 A 0x0001 B 0x0002 C 0x0004 inline Flags operator Flags lhs Flags rhs return st
  • 使用嵌套 C++ 类和枚举的优点和缺点?

    使用嵌套公共 C 类和枚举的优点和缺点是什么 例如 假设您有一个名为printer 并且此类还存储输出托盘上的信息 您可以 class printer public std string name enum TYPE TYPE LOCAL
  • 当将枚举转换为整数失败时,为什么我没有得到 InvalidCastException?

    public enum Animal Dog 1 Cat 2 Cow 3 int animalID 4 if Animal animalID Animal Dog does not throw exception AnimalID 无法转换
  • 为什么枚举可以有包私有构造函数?

    既然枚举构造函数只能由其常量调用 为什么允许它是包私有的呢 构造函数实际上不是包私有的 它是隐式的private接口方法的隐式方式public即使您不添加关键字 JLS 的相关部分 8 8 3 http docs oracle com ja
  • jnius 1.1导入错误

    当我想导入 jnius 时出现如下错误 Traceback most recent call last File C Python27 lib site packages jnius init py line 12 in
  • 使用 Serde 反序列化时有没有办法允许未知的枚举标签? [复制]

    这个问题在这里已经有答案了 我正在反序列化一个标记的枚举 derive Deserialize enum Foo A A B B C C 如果 Serde 遇到一个不存在的标签A B or C 那么就会抛出错误 有没有办法为未知标签添加包罗
  • 枚举类型的命名空间 - 最佳实践

    通常 需要同时使用多种枚举类型 有时 人们会发生名字冲突 我想到了两种解决方案 使用命名空间 或使用 更大的 枚举元素名称 尽管如此 命名空间解决方案有两种可能的实现 带有嵌套枚举的虚拟类 或完整的命名空间 我正在寻找所有三种方法的优缺点
  • 枚举解析似乎不适用于 Fluent NHibernate

    我有一个数据访问类 带有一个名为 Salutation 的枚举 public enum Salutation Unknown 0 Dame 1 etc Mr 5 etc 我正在使用 NHibernate 保留该类 直到今天早上我还在使用 h
  • 使用 JSON 可序列化枚举自动生成棉花糖模式

    创建与我的模型相同的棉花糖模式的日子已经一去不复返了 我发现这个优秀的答案 https stackoverflow com a 42892443 4097322这解释了我如何使用简单的装饰器从 SQA 模型自动生成模式 因此我实现了它并替换
  • Spring Data Mongo 无法找到 Enum 的 PersistentEntity

    编辑 我发现了一个相关问题here https stackoverflow com questions 28972455 does spring data mongodb support enums 但仅有的两个答案相互矛盾 并且没有足够的
  • 在 .pyx 文件中导入非整数常量

    如何声明常量 各种类型 不仅仅是枚举值 并在多个之间共享它们 pyx files 在一个 pyx文件中 我可以声明和使用常量 DEF FavouriteFood spam DEF ArraySize 42 print FavouriteFo

随机推荐