Blame tests/run/cfunc_convert.pyx

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)