Как я уже говорил в комментариях, вы можете сделать это с помощью .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
Я подозреваю, что вы должны создать файл .pxd определения как для '' a.py' и b.py' и определить типы там. К сожалению, это связано с дублированием информации в двух местах, но это не нарушает возможности использования 'a.py' и' .b.py' из простого Python. – DavidW
Я пробовал это, но тогда компиляция cython больше не работает. По той причине, что вы не можете использовать 'cimport' в' .py'file для совместного использования файла определения – dominicp
Если вы определяете тип аргумента функции, вы можете поместить cimport в файл b.pxd. Если вы определяете тип внутри функции, я не думаю, что вы можете (в этом случае я не знаю!) – DavidW