1# cython: binding=True
2# mode: run
3# tag: cyfunction,qualname
4
5import sys
6
7
8def test_qualname():
9    """
10    >>> test_qualname.__qualname__
11    'test_qualname'
12    >>> test_qualname.__qualname__ = 123 #doctest:+ELLIPSIS
13    Traceback (most recent call last):
14    TypeError: __qualname__ must be set to a ... object
15    >>> test_qualname.__qualname__ = 'foo'
16    >>> test_qualname.__qualname__
17    'foo'
18    """
19
20
21def test_builtin_qualname():
22    """
23    >>> test_builtin_qualname()
24    list.append
25    len
26    """
27    if sys.version_info >= (3, 3):
28        print([1, 2, 3].append.__qualname__)
29        print(len.__qualname__)
30    else:
31        print('list.append')
32        print('len')
33
34
35def test_nested_qualname():
36    """
37    >>> outer, lambda_func, XYZ = test_nested_qualname()
38
39    >>> outer().__qualname__
40    'test_nested_qualname.<locals>.outer.<locals>.Test'
41    >>> outer().test.__qualname__
42    'test_nested_qualname.<locals>.outer.<locals>.Test.test'
43    >>> outer()().test.__qualname__
44    'test_nested_qualname.<locals>.outer.<locals>.Test.test'
45
46    >>> outer()().test().__qualname__
47    'XYZinner'
48    >>> outer()().test().Inner.__qualname__
49    'XYZinner.Inner'
50    >>> outer()().test().Inner.inner.__qualname__
51    'XYZinner.Inner.inner'
52
53    >>> lambda_func.__qualname__
54    'test_nested_qualname.<locals>.<lambda>'
55
56    >>> XYZ.__qualname__
57    'XYZ'
58    >>> XYZ.Inner.__qualname__
59    'XYZ.Inner'
60    >>> XYZ.Inner.inner.__qualname__
61    'XYZ.Inner.inner'
62    """
63    def outer():
64        class Test(object):
65            def test(self):
66                global XYZinner
67                class XYZinner:
68                    class Inner:
69                        def inner(self):
70                            pass
71
72                return XYZinner
73        return Test
74
75    global XYZ
76    class XYZ(object):
77        class Inner(object):
78            def inner(self):
79                pass
80
81    return outer, lambda:None, XYZ
82