如何检查 Python 中的对象是否为 PyCapsule?
How to check if an object in Python is a PyCapsule?
我有一个接收和接受 PyCapsule 对象的 C 扩展。
在我的 python 包装器中,如何检查 python 对象是否属于 PyCapsule 类型对象?
>>> # My C extension
>>> foo = Foo()
>>> capsule = foo.to_capsule() # returns a PyCapsule object from the C extension
>>> capsule
<capsule object "foo" at 0xf707df08>
>>> type(capsule)
<class 'PyCapsule'>
isinstance(capsule, PyCapsule)
NameError: name 'PyCapsule' is not defined
我想做的是写一个像这样的函数:
def push_capsule(capsule):
# check that the `capsule` is of type PyCapsule
# c_extension.push_capsule(capsule)
一般来说,首先检查您的 API 是否提供某种方式来访问您要引用的 class。
如果没有,从虚拟实例中恢复 class。
PyCapsule = type(Foo().to_capsule())
...
if isinstance(bar, PyCapsule):
...
有点乱,但你可以从ctypes
:
def get_capsule_type():
class PyTypeObject(ctypes.Structure):
pass # don't need to define the full structure
capsuletype = PyTypeObject.in_dll(ctypes.pythonapi, "PyCapsule_Type")
capsuletypepointer = ctypes.pointer(capsuletype)
return ctypes.py_object.from_address(ctypes.addressof(capsulepointerpointer)).value
从地址创建 py_object
看起来需要一个包含 PyObject*
的地址,而不是 PyObject*
本身,因此需要额外的间接层。
如您所述,Python 无法直接访问 PyCapsule 类型。要在没有严重 ctypes 依赖的情况下检测它(在 DavidW 接受的答案中),我会改为执行以下操作:
def is_capsule(o):
t = type(o)
return t.__module__ == 'builtins' and t.__name__ == 'PyCapsule'
我有一个接收和接受 PyCapsule 对象的 C 扩展。
在我的 python 包装器中,如何检查 python 对象是否属于 PyCapsule 类型对象?
>>> # My C extension
>>> foo = Foo()
>>> capsule = foo.to_capsule() # returns a PyCapsule object from the C extension
>>> capsule
<capsule object "foo" at 0xf707df08>
>>> type(capsule)
<class 'PyCapsule'>
isinstance(capsule, PyCapsule)
NameError: name 'PyCapsule' is not defined
我想做的是写一个像这样的函数:
def push_capsule(capsule):
# check that the `capsule` is of type PyCapsule
# c_extension.push_capsule(capsule)
一般来说,首先检查您的 API 是否提供某种方式来访问您要引用的 class。
如果没有,从虚拟实例中恢复 class。
PyCapsule = type(Foo().to_capsule())
...
if isinstance(bar, PyCapsule):
...
有点乱,但你可以从ctypes
:
def get_capsule_type():
class PyTypeObject(ctypes.Structure):
pass # don't need to define the full structure
capsuletype = PyTypeObject.in_dll(ctypes.pythonapi, "PyCapsule_Type")
capsuletypepointer = ctypes.pointer(capsuletype)
return ctypes.py_object.from_address(ctypes.addressof(capsulepointerpointer)).value
从地址创建 py_object
看起来需要一个包含 PyObject*
的地址,而不是 PyObject*
本身,因此需要额外的间接层。
如您所述,Python 无法直接访问 PyCapsule 类型。要在没有严重 ctypes 依赖的情况下检测它(在 DavidW 接受的答案中),我会改为执行以下操作:
def is_capsule(o):
t = type(o)
return t.__module__ == 'builtins' and t.__name__ == 'PyCapsule'