forked from RustPython/RustPython
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfunction_args.py
More file actions
116 lines (73 loc) · 1.79 KB
/
function_args.py
File metadata and controls
116 lines (73 loc) · 1.79 KB
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
from testutils import assert_raises
def sum(x, y):
return x+y
def total(a, b, c, d):
return sum(sum(a,b), sum(c,d))
assert total(1,1,1,1) == 4
assert total(1,2,3,4) == 10
assert sum(1, 1) == 2
assert sum(1, 3) == 4
def sum2y(x, y):
return x+y*2
assert sum2y(1, 1) == 3
assert sum2y(1, 3) == 7
def va(a, b=2, *c, d, **e):
assert a == 1
assert b == 22
assert c == (3, 4)
assert d == 1337
assert e['f'] == 42
va(1, 22, 3, 4, d=1337, f=42)
assert va.__defaults__ == (2,)
assert va.__kwdefaults__ is None
def va2(*args, **kwargs):
assert args == (5, 4)
assert len(kwargs) == 0
va2(5, 4)
x = (5, 4)
va2(*x)
va2(5, *x[1:])
def va3(x, *, a, b=2, c=9):
return x + b + c
assert va3(1, a=1, b=10) == 20
with assert_raises(TypeError):
va3(1, 2, 3, a=1, b=10)
with assert_raises(TypeError):
va3(1, b=10)
assert va3.__defaults__ is None
kw_defaults = va3.__kwdefaults__
# assert va3.__kwdefaults__ == {'b': 2, 'c': 9}
assert set(kw_defaults) == {'b', 'c'}
assert kw_defaults['b'] == 2
assert kw_defaults['c'] == 9
x = {'f': 42, 'e': 1337}
y = {'d': 1337}
va(1, 22, 3, 4, **x, **y)
# star arg after keyword args:
def fubar(x, y, obj=None):
assert x == 4
assert y == 5
assert obj == 6
rest = [4, 5]
fubar(obj=6, *rest)
# https://www.python.org/dev/peps/pep-0468/
def func(**kwargs):
return list(kwargs.items())
empty_kwargs = func()
assert empty_kwargs == []
kwargs = func(a=1, b=2)
assert kwargs == [('a', 1), ('b', 2)]
kwargs = func(a=1, b=2, c=3)
assert kwargs == [('a', 1), ('b', 2), ('c', 3)]
def inc(n):
return n + 1
with assert_raises(SyntaxError):
exec("inc(n=1, n=2)")
with assert_raises(SyntaxError):
exec("def f(a=1, b): pass")
def f(a):
pass
x = {'a': 1}
y = {'a': 2}
with assert_raises(TypeError):
f(**x, **y)