Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cython - Checking types of objects

Tags:

python

cython

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.

like image 773
ratiotile Avatar asked Nov 02 '25 10:11

ratiotile


1 Answers

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

like image 85
hivert Avatar answered Nov 04 '25 01:11

hivert



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!