is there a way to handle function/method keyword aliasing other than using
**kwargs
and coding the logic to handle it? for example i might have
position=
for a defined function/method but also want to allow
pos=
to be the same thing. what about multiple aliases? what if the caller uses more than one of them?
putfoo(bar,position=5,pos=3)
You can do anything in python, but this is really not pythonic
def putfoo(bar, position=None, pos=None):
pos = merge_aliases(None, position=position, pos=pos)
print('Position is:', repr(pos))
class TooManyParameters(RuntimeError):
pass
def merge_aliases(default, **kwargs):
d = {k: v for k, v in kwargs.items() if v is not default}
if d:
if len(d) > 1:
raise TooManyParameters(
'Only one of the following parameters can be set:',
list(d.keys()))
else:
return d.popitem()[1]
else:
return default
if __name__ == '__main__':
putfoo('hello', position=7)
putfoo('hello', pos=9)
putfoo('hello', position= 11, pos=13)
Output:
Position is: 7
Position is: 9
Traceback (most recent call last):
File "paillasse/multiargs.py", line 24, in <module>
putfoo('hello', position= 11, pos=13)
File "paillasse/multiargs.py", line 3, in putfoo
pos = merge_aliases(None, position=position, pos=pos)
File "paillasse/multiargs.py", line 15, in merge_aliases
list(d.keys()))
__main__.TooManyParameters: ('Only one of the following parameters can be set:', ['pos', 'position'])