对于结构,此处不允许使用 cdef 语句

2024-02-28

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

cdef struct A:
    int x
    int y
    int z

以及使用它的 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

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


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

我至少可以想到有这个要求的两个充分理由:

  • 更清楚的是:具有 C 背景的 Cython 用户在变量没有达到他们预期的范围时不会感到惊讶。
  • 这意味着 Cython 生成的 C 代码更紧密地跟踪原始 Cython 代码,我确信这使得 Cython 开发人员更容易调试和实现。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对于结构,此处不允许使用 cdef 语句 的相关文章

随机推荐