使用来自 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_CheckPyInt_AsLong 一个 IntEnum 值(尽管我还没有测试过)。