Как проверить, является ли объект в Python PyCapsule? - PullRequest
1 голос
/ 20 февраля 2020

У меня есть расширение C, которое получает и принимает объекты PyCapsule.

В моей оболочке 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)

Ответы [ 2 ]

2 голосов
/ 20 февраля 2020

В общем, сначала проверьте, предлагает ли ваш API какой-либо способ доступа к классу, на который вы хотите сослаться.

Если это не так, восстановите класс из фиктивного экземпляра.

PyCapsule = type(Foo().to_capsule())

...

if isinstance(bar, PyCapsule):
    ...
1 голос
/ 20 февраля 2020

Это немного беспорядок, но вы можете получить его из 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*, следовательно, дополнительный слой косвенности.

...