rustpython 0.1.0

A python interpreter written in rust.
from testutils import assertRaises


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 assertRaises(TypeError):
    va3(1, 2, 3, a=1, b=10)

with assertRaises(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)]