将函数作为Cython类的类属性传递

时间:2015-03-18 02:33:39

标签: python cython

我试图定义一个Cython类,它接受一个函数作为__init__函数中的一个类属性。

我关注了this question并尝试了以下

ctypedef int (*f_type)(int, int)

cdef class ClassWFunction:
    cdef f_type f

    def __init__( self, f_type f):
        self.f = f

    def doStuff(self, int x, int y):
        return self.f(x, y)

cdef int example_f(int a, int b):
    return a*b

classInstance = ClassWFunction(example_f)
classInstance.doStuff(2, 4)

给了我错误:

Cannot convert 'int (int, int)' to Python object

我还阅读了Cython的文档中的this page并尝试了这种方法:

cdef class f_type:
    cpdef int evaluate(self, int a, int b) except *:
        return 0

cdef class ClassWFunctionV2:
    cdef f_type f

    def __init__( self, f_type f):
        self.f = f

    def doStuff(self, int a, int b):
        return self.f.evaluate(a, b)


cdef class example_f(f_type):
    cpdef int evaluate(self, int a, int b) except *:
        return a*b    


classInstance = ClassWFunctionV2(example_f)
classInstance.doStuff(3, 4)

给了我一个TypeError

TypeError: Argument 'f' has incorrect type (expected _cython_magic_9f51dc40b83b28506fce9fb260a84618.f_type, got type)

希望有一种方法可以让我的第一次尝试工作,因为第二种方法有很多样板,我不太明白! 谢谢你的时间......

--------编辑----------

以这种方式编写代码的重点是双重的:

1)在实例化类时有一种灵活的方式来更改f函数。 2)f函数在许多类方法中被重用,所以我想将它分配给self

在我的纯Python代码中,我做了像

这样的事情
def f1(x): return x**2
def f2(x): return x**3

cl1 = ClassWFunction(f1)
cl2 = ClassWFunction(f2)

然后继续用这些类做事。但是,我并不是100%确定这是最好的方式,所以请随意提出不同的方法。

-------- Edit2 ----------

作为一个不太灵活但(希望!)更容易的替代方案,我试图将该函数硬编码到类上。这符合上面的目标(2),即使它不符合目标(1)。

考虑(这也会产生错误)

ctypedef int (*f_type)(int)
cdef class ClassWFunction:
    cdef f_type example_f
    cdef double x

    def __init__( self, int x):
        self.x = x
        # Tried with a python function too
        cdef int example_f(int z):
            return x*z
        self.example_f = example_f

    def doStuff(self, int x, int y):
        return self.example_f(x)*y

classInstance = ClassWFunction(3)
classInstance.doStuff(2, 4)

0 个答案:

没有答案