cython
1# mode: run
2# tag: cyfunction
3# cython: binding=True
4
5cimport cython
6
7
8class PyClass(object):
9a = 2
10
11
12class PyClass99(object):
13a = 99
14
15def pymethod(self, x, y=1, z=PyClass):
16"""
17>>> obj = PyClass99()
18>>> obj.pymethod(0)
19(0, 1, 2)
20"""
21return x, y, z.a
22
23
24cdef class CyClass:
25cpdef 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)
35Traceback (most recent call last):
36AttributeError: 'int' object has no attribute 'a'
37"""
38return x, y, z.a
39
40y_value = 3
41p_class = PyClass
42
43cpdef cpmethod2(self, x, y=y_value, z=p_class):
44"""
45>>> obj = CyClass()
46>>> obj.cpmethod2(0)
47(0, 3, 2)
48"""
49return x, y, z.a
50
51def pymethod(self, x, y=y_value, z=p_class):
52"""
53>>> obj = CyClass()
54>>> obj.pymethod(0)
55(0, 3, 2)
56"""
57return x, y, z.a
58
59# change values to check that defaults above stay unmodified
60y_value = 98
61p_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)
73Traceback (most recent call last):
74AttributeError: 'int' object has no attribute 'a'
75"""
76return 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)
89Traceback (most recent call last):
90AttributeError: 'int' object has no attribute 'a'
91"""
92return x, y, z.a
93