1# mode: run
2# tag: cyfunction
3# cython: binding=True
4
5cimport cython
6
7
8class PyClass(object):
9    a = 2
10
11
12class PyClass99(object):
13    a = 99
14
15    def pymethod(self, x, y=1, z=PyClass):
16        """
17        >>> obj = PyClass99()
18        >>> obj.pymethod(0)
19        (0, 1, 2)
20        """
21        return x, y, z.a
22
23
24cdef class CyClass:
25    cpdef cpmethod(self, x, y=1, z=PyClass):
26        """
27        >>> obj = CyClass()
28        >>> obj.cpmethod(0)
29        (0, 1, 2)
30        >>> obj.cpmethod(0, 3)
31        (0, 3, 2)
32        >>> obj.cpmethod(0, 3, PyClass)
33        (0, 3, 2)
34        >>> obj.cpmethod(0, 3, 5)
35        Traceback (most recent call last):
36        AttributeError: 'int' object has no attribute 'a'
37        """
38        return x, y, z.a
39
40    y_value = 3
41    p_class = PyClass
42
43    cpdef cpmethod2(self, x, y=y_value, z=p_class):
44        """
45        >>> obj = CyClass()
46        >>> obj.cpmethod2(0)
47        (0, 3, 2)
48        """
49        return x, y, z.a
50
51    def pymethod(self, x, y=y_value, z=p_class):
52        """
53        >>> obj = CyClass()
54        >>> obj.pymethod(0)
55        (0, 3, 2)
56        """
57        return x, y, z.a
58
59    # change values to check that defaults above stay unmodified
60    y_value = 98
61    p_class = PyClass99
62
63
64cpdef func(x, y=1, z=PyClass):
65    """
66    >>> func(0)
67    (0, 1, 2)
68    >>> func(0, 3)
69    (0, 3, 2)
70    >>> func(0, 3, PyClass)
71    (0, 3, 2)
72    >>> func(0, 3, 5)
73    Traceback (most recent call last):
74    AttributeError: 'int' object has no attribute 'a'
75    """
76    return x, y, z.a
77
78
79@cython.ccall
80def pyfunc(x, y=1, z=PyClass):
81    """
82    >>> pyfunc(0)
83    (0, 1, 2)
84    >>> pyfunc(0, 3)
85    (0, 3, 2)
86    >>> pyfunc(0, 3, PyClass)
87    (0, 3, 2)
88    >>> pyfunc(0, 3, 5)
89    Traceback (most recent call last):
90    AttributeError: 'int' object has no attribute 'a'
91    """
92    return x, y, z.a
93