2016-02-24 2 views
0

У меня есть один модуль чистого питона a.py файл, содержащий класс с расширенной Cython:Cython: доля модуль чистого питона

@cython.cclass 
class Test 

Как я могу использовать этот класс в другой чистый модуль питона b.py? Я попытался from a import Test, но тогда Cython компилятор говорит мне Not a type, где я использую Test в b.py

+0

Я подозреваю, что вы должны создать файл .pxd определения как для '' a.py' и b.py' и определить типы там. К сожалению, это связано с дублированием информации в двух местах, но это не нарушает возможности использования 'a.py' и' .b.py' из простого Python. – DavidW

+0

Я пробовал это, но тогда компиляция cython больше не работает. По той причине, что вы не можете использовать 'cimport' в' .py'file для совместного использования файла определения – dominicp

+0

Если вы определяете тип аргумента функции, вы можете поместить cimport в файл b.pxd. Если вы определяете тип внутри функции, я не думаю, что вы можете (в этом случае я не знаю!) – DavidW

ответ

1

Как я уже говорил в комментариях, вы можете сделать это с помощью .pxd файлов в дополнение к .py файлов для указания типов. Я понимаю, это не так элегантно, как положить все в файлы .py, но насколько я знаю, это лучшее, что вы можете сделать.

a.py:

class Test: 
    pass 

a.pxd:

cdef class Test: 
    pass 

b.py:

# here I use Test in all the places I think you could want to use it: 
# as a function argument 
# as a variable in a function 
# in a class 
import a 

def f(x): 
    return x 

def g(): 
    t = a.Test() 
    return t 

class C: 
    pass 

b.pxd:

import cython 
cimport a 

cpdef f(a.Test x) 

@cython.locals(t=a.Test) 
cpdef g() 

cdef class C: 
    cdef a.Test t 

Вы можете проверить правильность использования информации о типе, проверив сгенерированный файл b.c.

Для справки, соответствующая документация http://docs.cython.org/src/tutorial/pure.html#magic-attributes-within-the-pxd

+0

works ! Я никогда не думал о создании файла pxd для 'b.py' – dominicp

Смежные вопросы