Изявлението cdef не е разрешено тук за структура

Имам прост 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 statement not allowed here“, сочеща към „cdef A a“. Не се оплаква от друга дефиниция на променлива A, ако е извън цикъла, но не разбирам какво е толкова специално за цикъла for.


person Student4K    schedule 31.07.2014    source източник


Отговори (1)


Python и C имат различни правила за обхват. Cython използва същите правила за обхват като Python, така че променливите, "декларирани" (първо присвоени) вътре в for/if/while или друг блок, са в обхвата на цялата функция. Това важи и за променливи, декларирани с помощта на cdef, но както видяхте, тези променливи трябва да бъдат декларирани на ниво функция, а не в подблок.

Мога да се сетя за поне две добри причини да имам това изискване:

  • По-ясно е: потребителите, които влизат в Cython с опит в C, няма да бъдат изненадани, когато техните променливи нямат обхвата, който биха могли да очакват.
  • Това означава, че C кодът, генериран от Cython, проследява по-точно оригиналния Cython код, което, сигурен съм, прави по-лесно отстраняване на грешки и внедряване за разработчиците на Cython.
person Bi Rico    schedule 01.08.2014
comment
За повече дискусии и примери вижте тук. - person mhsmith; 06.06.2020