# SPDX-License-Identifier: MIT
def describe(first, /, second=2, *extra, required, label='named', **options):
    print(first,second,extra,required,label,options)
    return extra,options
a,b=describe(1,3,'x',True,required=9,last=7,first=8)
print(a,b)
describe(4,required=6,label='explicit')
def keywords(*, value, scale=2):
    return value*scale
print(keywords(scale=3,value=7),keywords(value=8))
def variadic(*values):
    return values
print(variadic(),variadic(1,'two',False))
def named(**values):
    values['inside']=9
    return values
left=named(a=1,b=2)
right=named(b=3,a=4)
left['a']=10
print(left,right,left is right)
def positional(name, /, **kw):
    print(name,kw)
positional(5,name=6)
class Counter:
    def __init__(self,*,value=0):
        self.value=value
    def add(self,*amounts,scale=1,**options):
        self.value+=sum(amounts)*scale
        print(options)
        return self.value
class Child(Counter):
    def parent(self,*,amount):
        return super().add(amount,scale=2,source=3)
counter=Counter(value=3)
saved=counter.add
print(saved(1,2,scale=4,trace=5),counter.value)
print(Child(value=1).parent(amount=3))
def recursive(count,*,total=0):
    if count==0:
        return total
    return recursive(count-1,total=total+count)
print(recursive(5))
def effect(label):
    print(label)
    return 1
def ordered(a,*,b,c):
    print(a,b,c)
ordered(effect('positional'),c=effect('c'),b=effect('b'))
def retain(*items,**named):
    items[0].append(2)
    named['value'].append(3)
value=[1]
retain(value,value=value)
print(value)
class AllArguments:
    def count(*arguments):
        return len(arguments)
print(AllArguments().count(1,2))
