【问题标题】:What is the best way to check of an object is an Enum in Cython?检查对象的最佳方法是 Cython 中的枚举?
【发布时间】:2020-10-02 18:13:58
【问题描述】:

我正在寻找一种 Cythonic 方式(是的,Cython)来检查对象是否为 Enum 类型。具体来说,我想区分整数和 IntEnums。我正在寻找类似的东西:

cdef extern from "Python.h":
    bint PyObject_TypeCheck(object obj, PyTypeObject* type) nogil

PyObject_TypeCheck(obj, &PyEnumType_Type)

但是,是否在任何地方都定义了 PyEnumType_Type 之类的东西?

【问题讨论】:

  • 你最多应该有一个答案。

标签: python enums cython


【解决方案1】:

普通的旧 isinstance(obj, Enum) 在 Cython 中也可以正常工作,但它有良好的性能吗?可能是我想多了。

【讨论】:

  • 你想多了。如果您查看为此生成的 C 代码,它将是相当有效的 PyObject_TypeCheck 或类似代码。如果可能的话我不会把它放在一个快速的内循环中,但它基本上没问题
  • 我接受这个答案,因为它有效并且是对原始问题的最简单和最可靠的答案。 getattr() 技术是解决我最初在 Cython 中区分 int 和 intEnum 问题的好方法,但对于任何具有“名称”属性的东西都会注册为 True。
  • 您可能还想在isinstance() 检查中使用IntEnum 而不是Enum
【解决方案2】:

我想我可能已经找到了我要找的东西。在 cpython/include/enumobject.h 中定义了一个PyEnum_Type。我会尝试以下方法:

cdef extern from "Python.h":
    PyTypeObject PyEnum_Type
    bint PyObject_TypeCheck(object obj, PyTypeObject* type) nogil

PyObject_TypeCheck(obj, &PyEnum_Type)

【讨论】:

  • enumobject.hEnum 无关。 Enum 仅作为 Python 代码存在。
  • 好的,@EthanFurman。您对如何区分传递给 Cython 函数的 int 和 IntEnum 对象有什么建议吗?
【解决方案3】:

第三种方式不需要将 Enum 导入 Cython。

if getattr(val, 'name', None) is not None

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-21
    • 2015-08-08
    • 2021-12-23
    • 2018-08-17
    • 1970-01-01
    • 2016-05-12
    • 2011-05-24
    • 2020-05-21
    相关资源
    最近更新 更多