-
Notifications
You must be signed in to change notification settings - Fork 95
/
Copy pathfunction.py
130 lines (115 loc) · 2.61 KB
/
function.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# Copyright 2019 The go-python Authors. All rights reserved.
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file.
doc="function"
def fn(p):
"docstring"
return p+1
assert fn(1) == 2
# FIXME this doesn't work yet
#assert fn.__doc__ == "docstring"
#fn.__doc__ = "hello"
#assert fn.__doc__ == "hello"
assert str(type(fn)) == "<class 'function'>"
fn.x = 3
assert fn.x == 3
def f2(p):
return p+2
doc="check __code__"
fn.__code__ = f2.__code__
assert fn(1) == 3
try:
fn.__code__ = "bad"
except TypeError:
pass
else:
assert False, "TypeError not raised"
doc="check __defaults__"
def f3(p=2):
return p
assert f3.__defaults__ == (2,)
assert f3() == 2
f3.__defaults__ = (10,)
assert f3() == 10
assert f3.__defaults__ == (10,)
try:
f3.__defaults__ = "bad"
except TypeError:
pass
else:
assert False, "TypeError not raised"
del f3.__defaults__
assert f3.__defaults__ == None or f3.__defaults__ == ()
doc="check __kwdefaults__"
def f4(*, b=2):
return b
assert f4.__kwdefaults__ == {"b":2}
assert f4() == 2
f4.__kwdefaults__ = {"b":10}
assert f4() == 10
assert f4.__kwdefaults__ == {"b":10}
try:
f4.__kwdefaults__ = "bad"
except TypeError:
pass
else:
assert False, "TypeError not raised"
del f4.__kwdefaults__
assert f4.__kwdefaults__ == None or f4.__kwdefaults__ == {}
doc="check __annotations__"
def f5(a: "potato") -> "sausage":
pass
assert f5.__annotations__ == {'a': 'potato', 'return': 'sausage'}
f5.__annotations__ = {'a': 'potato', 'return': 'SAUSAGE'}
assert f5.__annotations__ == {'a': 'potato', 'return': 'SAUSAGE'}
try:
f5.__annotations__ = "bad"
except TypeError:
pass
else:
assert False, "TypeError not raised"
del f5.__annotations__
assert f5.__annotations__ == None or f5.__annotations__ == {}
doc="check __dict__"
def f6():
pass
assert f6.__dict__ == {}
f6.__dict__ = {'a': 'potato'}
assert f6.__dict__ == {'a': 'potato'}
try:
f6.__dict__ = "bad"
except TypeError:
pass
else:
assert False, "TypeError not raised"
try:
del f6.__dict__
except (TypeError, AttributeError):
pass
else:
assert False, "Error not raised"
doc="check __name__"
def f7():
pass
assert f7.__name__ == "f7"
f7.__name__ = "new_name"
assert f7.__name__ == "new_name"
try:
f7.__name__ = 1
except TypeError:
pass
else:
assert False, "TypeError not raised"
doc="check __qualname__"
def f8():
pass
assert f8.__qualname__ == "f8"
f8.__qualname__ = "new_qualname"
assert f8.__qualname__ == "new_qualname"
try:
f8.__qualname__ = 1
except TypeError:
pass
else:
assert False, "TypeError not raised"
doc="finished"