Domanda

How can I check the types of python objects within cython?

My Cython extension E compiles to E.pyd within a module M.

I am trying to check the type of a python parameter in class A of Cython extension E.

cdef class A:
    def foo(self, bar):
        if bar is A:
            print("ok")
        else
            print("invalid")

The trouble is when I go and use the extension from python,

from M import E
a = A()
b = A()
a.foo(b)

bar is not A, but rather M.E.A when I use type(b) from Python

I have tried if bar is M.E.A: from within Cython but the compiler complains undeclared name not builtin: M, since Cython doesn't know about the module.

È stato utile?

Soluzione

In Cython as in Python is is the object identity. It is not used for checking type.

  • You should write:

    if isinstance(bar, A):
        ...
    

    if you want to check if bar is of type A or any of its subtype

  • or

    if type(bar) is A:
        ...
    

    If you want to check is bar is exactly of type A.

Alternatively Cython provide type checking via:

def foo(self, A bar):

which allows the user to pass also None meaning no object. If you want to exclude None write:

def foo(self, A bar not None):

See Cython docs on extension types

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top