I have a simple Astruct.pyx with a struct definition (Astruct.pxd):
cdef struct A:
int x
int y
int z
And a Cython function, that uses it (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
However, when I try to build struct_test.pyx, I get this error: "cdef statement not allowed here", pointing at "cdef A a". It does not complain about another definition of A variable if it is outside the loop, but I do not understand what is so special about for loop.
Python and C have different scoping rules. Cython uses the same scoping rules as Python so variables "declared" (first assigned) inside of a for/if/while or other block are in scope for the whole function. This is also true for variables declared using cdef, but as you've seen these variable must be declared at the function level and not in a sub-block.
I can think of at least two good reasons to have this requirement:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With