2017-02-20 5 views
0

У меня есть функция Cython как:ctypedef функции Cython с аргументами по умолчанию

cdef void foo(int a, int b=1, int c=2): 
    pass 

и функцию геттера вернуть его адрес:

def get_foo(): 
    return <size_t>foo 

так что я могу получить функцию foo «s адрес где-то и вернуть его обратно к реальной функции в cython (например: обратный вызов, который можно использовать в python).

Проблема в том, как написать такой тип?

Я пробовал:

cdef void foo(int a, int b=1, int c=2): 
    pass 
ctypedef void (*foo_type)(int a, int b, int c) 
cdef foo_type f = foo 

это не компилируется, Cython жалуется: Невозможно присвоить тип 'недействительный (INT, STRUCT __pyx_opt_args_46_cython_magic_49f265438c694830523a60bef4fe2ee8_foo * __ pyx_optional_args)' к 'foo_type'

Из электронного письма ошибки, можно заметить, что аргументы опции (по умолчанию) завернуты в структуру cython.

Есть ли способ сделать такой ctypedef в cython? Если нет, то я думаю, что я бы лучше оставить в значении по умолчанию :-(

ответ

0

Вы можете создавать небольшие обертки без значений по умолчанию:.

cdef void foo_abc(int a, int b, int c): 
    foo(a,b,c) 

# if you need it 
cdef void foo_ab(int a, int b): 
    foo(a,b) 
# etc 

Они будут конвертируемыми функционировать указатели:

cdef foo_type f = foo_abc 

потеря скорости от функций-оболочек будет мало, поэтому основные расходы только, что вам нужно написать немного больше кода.

+0

Спасибо за ответ. это возможный путь. Наконец Я понял, что аргумент по умолчанию не может быть предоставлен для указателей функций, а аргументы по умолчанию не учитываются для типа, это действительно вопрос для части c/C++. У меня есть функция со многими параметрами, большая часть из которых имеет значение по умолчанию для удобства, добавив столько оберток, что будет скучно, поэтому оставить значение по умолчанию в части c/cython и оставить его для части python будет лучше для меня , в конце концов, это расширение python: -D – oz1