|
Packit |
562c7a |
# mode: run
|
|
Packit |
562c7a |
# cython: always_allow_keywords=True
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
cimport cython
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
from libc.math cimport sqrt
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
cdef void empty_cfunc():
|
|
Packit |
562c7a |
print "here"
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
# same signature
|
|
Packit |
562c7a |
cdef void another_empty_cfunc():
|
|
Packit |
562c7a |
print "there"
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def call_empty_cfunc():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> call_empty_cfunc()
|
|
Packit |
562c7a |
here
|
|
Packit |
562c7a |
there
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
cdef object py_func = empty_cfunc
|
|
Packit |
562c7a |
py_func()
|
|
Packit |
562c7a |
cdef object another_py_func = another_empty_cfunc
|
|
Packit |
562c7a |
another_py_func()
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
cdef double square_c(double x):
|
|
Packit |
562c7a |
return x * x
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def call_square_c(x):
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> call_square_c(2)
|
|
Packit |
562c7a |
4.0
|
|
Packit |
562c7a |
>>> call_square_c(-7)
|
|
Packit |
562c7a |
49.0
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
cdef object py_func = square_c
|
|
Packit |
562c7a |
return py_func(x)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def return_square_c():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> square_c = return_square_c()
|
|
Packit |
562c7a |
>>> square_c(5)
|
|
Packit |
562c7a |
25.0
|
|
Packit |
562c7a |
>>> square_c(x=4)
|
|
Packit |
562c7a |
16.0
|
|
Packit |
562c7a |
>>> square_c.__doc__ # FIXME: try to make original C function name available
|
|
Packit |
562c7a |
'wrap(x: float) -> float'
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
return square_c
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def return_libc_sqrt():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> sqrt = return_libc_sqrt()
|
|
Packit |
562c7a |
>>> sqrt(9)
|
|
Packit |
562c7a |
3.0
|
|
Packit |
562c7a |
>>> sqrt(x=9)
|
|
Packit |
562c7a |
3.0
|
|
Packit |
562c7a |
>>> sqrt.__doc__
|
|
Packit |
562c7a |
'wrap(x: float) -> float'
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
return sqrt
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
global_csqrt = sqrt
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def test_global():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> global_csqrt(9)
|
|
Packit |
562c7a |
3.0
|
|
Packit |
562c7a |
>>> global_csqrt.__doc__
|
|
Packit |
562c7a |
'wrap(x: float) -> float'
|
|
Packit |
562c7a |
>>> test_global()
|
|
Packit |
562c7a |
double (double) nogil
|
|
Packit |
562c7a |
Python object
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
print cython.typeof(sqrt)
|
|
Packit |
562c7a |
print cython.typeof(global_csqrt)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
cdef long long rad(long long x):
|
|
Packit |
562c7a |
cdef long long rad = 1
|
|
Packit |
562c7a |
for p in range(2, <long long>sqrt(x) + 1):
|
|
Packit |
562c7a |
if x % p == 0:
|
|
Packit |
562c7a |
rad *= p
|
|
Packit |
562c7a |
while x % p == 0:
|
|
Packit |
562c7a |
x //= p
|
|
Packit |
562c7a |
if x == 1:
|
|
Packit |
562c7a |
break
|
|
Packit |
562c7a |
return rad
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
cdef bint abc(long long a, long long b, long long c) except -1:
|
|
Packit |
562c7a |
if a + b != c:
|
|
Packit |
562c7a |
raise ValueError("Not a valid abc candidate: (%s, %s, %s)" % (a, b, c))
|
|
Packit |
562c7a |
return rad(a*b*c) < c
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def call_abc(a, b, c):
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> call_abc(2, 3, 5)
|
|
Packit |
562c7a |
False
|
|
Packit |
562c7a |
>>> call_abc(1, 63, 64)
|
|
Packit |
562c7a |
True
|
|
Packit |
562c7a |
>>> call_abc(2, 3**10 * 109, 23**5)
|
|
Packit |
562c7a |
True
|
|
Packit |
562c7a |
>>> call_abc(a=2, b=3**10 * 109, c=23**5)
|
|
Packit |
562c7a |
True
|
|
Packit |
562c7a |
>>> call_abc(1, 1, 1)
|
|
Packit |
562c7a |
Traceback (most recent call last):
|
|
Packit |
562c7a |
...
|
|
Packit |
562c7a |
ValueError: Not a valid abc candidate: (1, 1, 1)
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
cdef object py_func = abc
|
|
Packit |
562c7a |
return py_func(a, b, c)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def return_abc():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> abc = return_abc()
|
|
Packit |
562c7a |
>>> abc(2, 3, 5)
|
|
Packit |
562c7a |
False
|
|
Packit |
562c7a |
>>> abc.__doc__
|
|
Packit |
562c7a |
"wrap(a: 'long long', b: 'long long', c: 'long long') -> bool"
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
return abc
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
ctypedef double foo
|
|
Packit |
562c7a |
cdef foo test_typedef_cfunc(foo x):
|
|
Packit |
562c7a |
return x
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def test_typedef(x):
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> test_typedef(100)
|
|
Packit |
562c7a |
100.0
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
return (<object>test_typedef_cfunc)(x)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
cdef union my_union:
|
|
Packit |
562c7a |
int a
|
|
Packit |
562c7a |
double b
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
cdef struct my_struct:
|
|
Packit |
562c7a |
int which
|
|
Packit |
562c7a |
my_union y
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
cdef my_struct c_struct_builder(int which, int a, double b):
|
|
Packit |
562c7a |
cdef my_struct value
|
|
Packit |
562c7a |
value.which = which
|
|
Packit |
562c7a |
if which:
|
|
Packit |
562c7a |
value.y.a = a
|
|
Packit |
562c7a |
else:
|
|
Packit |
562c7a |
value.y.b = b
|
|
Packit |
562c7a |
return value
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def return_struct_builder():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> make = return_struct_builder()
|
|
Packit |
562c7a |
>>> d = make(0, 1, 2)
|
|
Packit |
562c7a |
>>> d['which']
|
|
Packit |
562c7a |
0
|
|
Packit |
562c7a |
>>> d['y']['b']
|
|
Packit |
562c7a |
2.0
|
|
Packit |
562c7a |
>>> d = make(1, 1, 2)
|
|
Packit |
562c7a |
>>> d['which']
|
|
Packit |
562c7a |
1
|
|
Packit |
562c7a |
>>> d['y']['a']
|
|
Packit |
562c7a |
1
|
|
Packit |
562c7a |
>>> make.__doc__
|
|
Packit |
562c7a |
"wrap(which: 'int', a: 'int', b: float) -> 'my_struct'"
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
return c_struct_builder
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
cdef object test_object_params_cfunc(a, b):
|
|
Packit |
562c7a |
return a, b
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def test_object_params(a, b):
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> test_object_params(1, 'a')
|
|
Packit |
562c7a |
(1, 'a')
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
return (<object>test_object_params_cfunc)(a, b)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
cdef tuple test_builtin_params_cfunc(list a, dict b):
|
|
Packit |
562c7a |
return a, b
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def test_builtin_params(a, b):
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> test_builtin_params([], {})
|
|
Packit |
562c7a |
([], {})
|
|
Packit |
562c7a |
>>> test_builtin_params(1, 2)
|
|
Packit |
562c7a |
Traceback (most recent call last):
|
|
Packit |
562c7a |
...
|
|
Packit |
562c7a |
TypeError: Argument 'a' has incorrect type (expected list, got int)
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
return (<object>test_builtin_params_cfunc)(a, b)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def return_builtin_params_cfunc():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> cfunc = return_builtin_params_cfunc()
|
|
Packit |
562c7a |
>>> cfunc([1, 2], {'a': 3})
|
|
Packit |
562c7a |
([1, 2], {'a': 3})
|
|
Packit |
562c7a |
>>> cfunc.__doc__
|
|
Packit |
562c7a |
'wrap(a: list, b: dict) -> tuple'
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
return test_builtin_params_cfunc
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
cdef class A:
|
|
Packit |
562c7a |
def __repr__(self):
|
|
Packit |
562c7a |
return self.__class__.__name__
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
cdef class B(A):
|
|
Packit |
562c7a |
pass
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
cdef A test_cdef_class_params_cfunc(A a, B b):
|
|
Packit |
562c7a |
return b
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def test_cdef_class_params(a, b):
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> test_cdef_class_params(A(), B())
|
|
Packit |
562c7a |
B
|
|
Packit |
562c7a |
>>> test_cdef_class_params(B(), A())
|
|
Packit |
562c7a |
Traceback (most recent call last):
|
|
Packit |
562c7a |
...
|
|
Packit |
562c7a |
TypeError: Argument 'b' has incorrect type (expected cfunc_convert.B, got cfunc_convert.A)
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
return (<object>test_cdef_class_params_cfunc)(a, b)
|