我在 Python 中有一个枚举(将 enum
包反向移植到 2.7),它只包含整数:
import enum
class MyEnum(enum.Enum):
val = 0
假设我在指向 MyEnum.val
的 C 扩展中收到一个 PyObject *
。我想要与 PyObject *
关联的整数值。如何最简洁地获得它?
查看 enum34
的来源向后移植,就像 enum
3.4+ 中的模块,它是纯 Python,不做任何公开自定义 C API 的事情。
因此,您只需使用 PyObject_GetAttr
和 friend 访问类属性。特别是,如果您有一个 MyEnum.val
,您需要获取它的 value
属性,这将是一个 int
,然后您可以PyInt_AsLong
。
这与 Python 中的工作方式相同。如果您尝试在需要 int
的地方使用 MyEnum.val
,您应该得到一个 TypeError
;如果您尝试显式调用 int(MyEnum.val)
,您将肯定得到一个TypeError
。所以,虽然我还没有测试过,PyInt_AsLong
直接在常量上而不是它的 value
应该引发一个 TypeError
并返回 -1。
如果你想要枚举常量像 int
的子类型,那么,作为 enum
文档解释,你想要IntEnum
.通常,这并不是您真正想要的(正如文档所解释的),但如果是,那当然可以。并且您应该能够 PyInt_Check
和 PyInt_AsLong
一个 IntEnum
值(尽管我还没有测试过)。
我是一名优秀的程序员,十分优秀!