Cython,使用类

时间:2017-02-13 22:46:39

标签: function pointers cython

我正在尝试在cython类中使用指针。

outside_class ctypedef就像魅力一样,但我无法让inside_class工作。抛出“此处不允许的ctypedef语句”错误,我不明白错误。

为什么要这样做
outside_class typdef有效,所以我认为它也应该在里面工作。我无法让它工作,所以我试图找到更多的信息,不幸的是所有信息都是关于outside_class的例子,所以我不知道是否允许另一个,甚至可能。对我来说,似乎唯一的区别是self参数。

为什么我希望这项工作
这个类将包含35个具有相同参数的函数,当使用时,只按特定顺序调用这些函数的一部分。初始化时,我想以正确的顺序创建一个包含所有函数的数组。当然,也欢迎采用不同的方式。

更新的代码示例 14-02

测试A& B工作,但C& D没有,错误信息如下。

我的代码:

ctypedef int (*outside_class)()
ctypedef int (*inside_class)(Preprocess)

cdef int outside_foo():
    return 12

cdef int outside_bar(Preprocess self):
    return 20

cdef class Preprocess:

    cdef int inside_foo(self):
        return 18

    cdef int inside_bar(self):
        return 14

    cdef int inside_sek(self):
        return 16

    def __init__(self):

        cdef outside_class test_A
        test_A = &outside_foo
        print( test_A() )

        cdef inside_class test_B
        test_B = &outside_bar
        print( test_B(self) )

        cdef inside_class test_C
        test_C = &self.inside_foo
        #print( test_C(self) )

        print( "no error, yet.." )

        cdef inside_class test_D
        test_D = &self.inside_foo
        print( test_D(self) )

错误

/home/boss/.pyxbld/temp.linux-x86_64-2.7/pyrex/aa/preprocessing/preprocessing.c: In function ‘__pyx_pf_7aa_13preprocessing_13preprocessing_10Preprocess___init__’:
/home/boss/.pyxbld/temp.linux-x86_64-2.7/pyrex/aa/preprocessing/preprocessing.c:938:18: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
   __pyx_v_test_C = (&((struct __pyx_vtabstruct_7aa_13preprocessing_13preprocessing_Preprocess *)__pyx_v_se
                  ^
/home/boss/.pyxbld/temp.linux-x86_64-2.7/pyrex/aa/preprocessing/preprocessing.c:955:18: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
   __pyx_v_test_D = (&((struct __pyx_vtabstruct_7aa_13preprocessing_13preprocessing_Preprocess *)__pyx_v_se
                  ^
12
20
no error, yet..
Segmentation fault (core dumped)

1 个答案:

答案 0 :(得分:1)

cythoncdeftype定义中看到class后立即引发错误。它甚至没有查看或运行&self.inside_foo任务:

0000:~/mypy/cython3$ cython stack42214943.pyx -a

Error compiling Cython file:
------------------------------------------------------------
...
cdef int outside_foo():
    return 12

cdef class Preprocess:

    ctypedef int (*inside_class)(Preprocess)
   ^
------------------------------------------------------------

stack42214943.pyx:8:4: ctypedef statement not allowed here

如果我尝试cdef int(*)(Preprocess) inside_test,我会得到Syntax error in C variable declaration。再次在self行之前。

(编辑)

使用以下代码,我可以创建并运行包含3个函数的python列表和同样的C数组。

def __init__(self):
    cdef outside_class test_A
    test_A = &outside_foo
    print( test_A() )

    cdef inside_class test_B
    test_B = &outside_bar
    print( test_B(self) )
    print(self.inside_foo())

cpdef evalc(self):
    # cdef int (*inside_array[3]) (Preprocess)
    cdef inside_class inside_array[3]
    inside_array[0] = self.inside_foo
    inside_array[1] = self.inside_bar
    inside_array[2] = self.inside_sek

    print('eval inside_array')
    for fn in inside_array:
        print(fn(self))

def evals(self):
    alist = [self.inside_foo, self.inside_bar, self.inside_sek]
    alist = [fn(self) for fn in alist]
    print(alist)
    self.evalc()

在Ipython会话中,我可以编译并导入它,并使用:

运行它
In [3]: p=stack42214943.Preprocess()
12
20
18

In [4]: p.evals()
[18, 14, 16]
eval inside_array
18
14
16

In [5]: p.evalc()
eval inside_array
18
14
16

我还没有弄明白如何在inside_array函数之外定义和访问evalc。但也许我不需要。而不是打印,该函数可以将3个值作为某种int数组或列表返回。