使用子类型除外,声明cython cdef方法

时间:2014-03-24 23:08:17

标签: python exception-handling cython cpython

在使用cdef语句声明的cython函数和方法中,可能会引发python错误,必须在声明中使用某个版本的except -1声明。更多信息here

我想知道如果在父类型中未使用except -1定义该方法,是否可以在扩展类型的方法上使用except -1。一个例子可能会有所帮助。我希望LazyCow在调用moo时引发异常。这适用于beLazy,因为父Cow类型没有匹配方法,但对于moo方法,则忽略该异常。

cdef class Cow:

    cdef int moo(self):
        print 'moooooooo'
        return 0

cdef class LazyCow(Cow):

    cdef int moo(self) except -1:
        raise ValueError("I don't want to moo")

    cdef int beLazy(self) except -1:
        raise ValueError("I don't want to be lazy")

def run():
    cdef LazyCow cow

    cow = LazyCow()
    print "Running moo"
    cow.moo()
    print ""
    print "Running beLazy"
    cow.beLazy()

当我调用run时,我得到以下内容,moo中引发的错误将被忽略,但beLazy会按预期工作。

Running moo
Exception ValueError: ValueError("I don't want to moo",) in 'cowExample.LazyCow.moo' ignored

Running beLazy
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-2-157c9bda2cd6> in <module>()
----> 1 run()

/tmp/cowExample.so in cowExample.run (cowExample.c:784)()

/tmp/cowExample.so in cowExample.LazyCow.beLazy (cowExample.c:685)()

ValueError: I don't want to be lazy

我的问题,这是cython中的一个错误吗?如果不是,为什么我不能A)得到我期望的行为,或者B)在编译时得到警告/错误,我的方法声明不匹配。

0 个答案:

没有答案