forked from Rust-related/RustPython
132 lines
2.2 KiB
Python
132 lines
2.2 KiB
Python
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)
|
|
|
|
|
|
def f(a, b, /, c, d, *, e, f):
|
|
return a + b + c + d + e + f
|
|
|
|
assert f(1,2,3,4,e=5,f=6) == 21
|
|
assert f(1,2,3,d=4,e=5,f=6) == 21
|
|
assert f(1,2,c=3,d=4,e=5,f=6) == 21
|
|
with assert_raises(TypeError):
|
|
f(1,b=2,c=3,d=4,e=5,f=6)
|
|
with assert_raises(TypeError):
|
|
f(a=1,b=2,c=3,d=4,e=5,f=6)
|
|
with assert_raises(TypeError):
|
|
f(1,2,3,4,5,f=6)
|
|
with assert_raises(TypeError):
|
|
f(1,2,3,4,5,6)
|