这里不允许使用cdef语句来表示结构

Stu*_*t4K 6 cython

我有一个带结构定义的简单Astruct.pyx(Astruct.pxd):

cdef struct A:
    int x
    int y
    int z
Run Code Online (Sandbox Code Playgroud)

还有一个使用它的Cython函数(struct_test.pyx):

from random import randint
from Astruct cimport A

def do():
    N = 1000000
    M = 65535
    As = []
    total = 0
    for i in xrange(N):
        cdef A a
        a.x = randint(0, M)
        a.y = randint(0, M)
        a.z = randint(0, M)
        As.append(a)
    for i in xrange(N):
        total += As[i].x + As[i].y + As[i].z
    print total
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试构建struct_test.pyx时,我收到此错误:"此处不允许使用cdef语句",指向"cdef A a".如果它在循环之外,它不会抱怨A变量的另一个定义,但我不明白for循环有什么特别之处.

Bi *_*ico 14

Python和C有不同的范围规则.Cython使用与Python相同的范围规则,因此在for/ if/ while或其他块内"声明"(首先分配)的变量在整个函数的范围内.对于使用声明的变量也是如此cdef,但正如您所见,这些变量必须在函数级别而不是在子块中声明.

我能想到至少有两个很好的理由来满足这个要求:

  • 更清楚的是:当他们的变量没有他们可能期望的范围时,进入带有C背景的Cython的用户不会感到惊讶.
  • 这意味着Cython生成的C代码更密切地跟踪原始的Cython代码,我相信这对Cython开发人员的调试和实现更容易.