Dec-01-2019, 03:56 AM
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'])