2013-01-02 34 views
17

Có cách nào để nói với trình biên dịch Cython rằng param là hàm. Một cái gì đó nhưCó loại chức năng nào trong Cython không?

cpdef float calc_class_re(list data, func callback) 
+0

Nếu mọi thứ khác không thành công, bạn có thể có khả năng piggyback trên C 'typedef'. Có thể có một cách tốt hơn, thuần khiết-Cython mặc dù. – delnan

+0

Bạn có nghĩa là hàm python hay hàm c? nhận xét của "delnan" sẽ hoạt động cho c khi chữ ký hàm được biết. – shaunc

+0

Với chức năng 'cdef' hoặc' cpdef', functype kiểu C sẽ hoạt động. Giống như 'ctypedef (* my_func_type) (đối tượng, int, float, str)'. Bạn cần sử dụng kiểu 'object' cho các hàm tinh khiết-python. –

Trả lời

27

Nên tự giải thích ..? :)

# Define a new type for a function-type that accepts an integer and 
# a string, returning an integer. 
ctypedef int (*f_type)(int, str) 

# Extern a function of that type from foo.h 
cdef extern from "foo.h": 
    int do_this(int, str) 

# Passing this function will not work. 
cpdef int do_that(int a, str b): 
    return 0 

# However, this will work. 
cdef int do_stuff(int a, str b): 
    return 0 

# This functio uses a function of that type. Note that it cannot be a 
# cpdef function because the function-type is not available from Python. 
cdef void foo(f_type f): 
    print f(0, "bar") 

# Works: 
foo(do_this) # the externed function 
foo(do_stuff) # the cdef function 

# Error: 
# Cannot assign type 'int (int, str, int __pyx_skip_dispatch)' to 'f_type' 
foo(do_that) # the cpdef function 
Các vấn đề liên quan