使用来自 C 的 Python 2.7 枚举
Using a Python 2.7 enum from C
我在 Python 中有一个枚举(向后移植 enum
包到 2.7),它只包含整数:
import enum
class MyEnum(enum.Enum):
val = 0
假设我在指向 MyEnum.val
的 C 扩展中收到 PyObject *
。我想要与 PyObject *
关联的整数值。我如何最简洁地获得它?
查看 3.4+ 中 enum34
backport, just like the enum
模块的源代码,它是纯粹的 Python,并没有公开自定义 C API.
因此,您只需使用 PyObject_GetAttr
和朋友访问 class 属性。特别是,如果你有一个 MyEnum.val
,你需要得到它的 value
属性,这将是一个 int
,然后你可以 PyInt_AsLong
.
这与 Python 中的工作方式相同。如果您尝试在需要 int
的地方使用 MyEnum.val
,您应该得到 TypeError
;如果您尝试显式调用 int(MyEnum.val)
,您将 肯定 得到 TypeError
。所以,虽然我还没有测试过,但 PyInt_AsLong
直接在常量上而不是它的 value
应该引发 TypeError
和 return -1.
如果您希望枚举常量的行为类似于 int
的子类型,那么,作为 enum
docs explain, you want IntEnum
。通常,这并不是您真正想要的(正如文档所解释的),但如果是,那当然可以。而且你应该能够 PyInt_Check
和 PyInt_AsLong
一个 IntEnum
值(尽管我还没有测试过)。
我在 Python 中有一个枚举(向后移植 enum
包到 2.7),它只包含整数:
import enum
class MyEnum(enum.Enum):
val = 0
假设我在指向 MyEnum.val
的 C 扩展中收到 PyObject *
。我想要与 PyObject *
关联的整数值。我如何最简洁地获得它?
查看 3.4+ 中 enum34
backport, just like the enum
模块的源代码,它是纯粹的 Python,并没有公开自定义 C API.
因此,您只需使用 PyObject_GetAttr
和朋友访问 class 属性。特别是,如果你有一个 MyEnum.val
,你需要得到它的 value
属性,这将是一个 int
,然后你可以 PyInt_AsLong
.
这与 Python 中的工作方式相同。如果您尝试在需要 int
的地方使用 MyEnum.val
,您应该得到 TypeError
;如果您尝试显式调用 int(MyEnum.val)
,您将 肯定 得到 TypeError
。所以,虽然我还没有测试过,但 PyInt_AsLong
直接在常量上而不是它的 value
应该引发 TypeError
和 return -1.
如果您希望枚举常量的行为类似于 int
的子类型,那么,作为 enum
docs explain, you want IntEnum
。通常,这并不是您真正想要的(正如文档所解释的),但如果是,那当然可以。而且你应该能够 PyInt_Check
和 PyInt_AsLong
一个 IntEnum
值(尽管我还没有测试过)。