Based on @ThiefMaster's comment about **kwargs:
If you accept 20 arguments, it might be necessary for your users to send arguments via the keyword instead of the position: with 20 arguments, there is a decent chance that someone using your code will receive the arguments in the wrong order.
Only consider accepting kwargs, having a predefined list of keys that you want to accept, and raising a ValueError if you haven't received them. That way you can use **kwargsand then verify that everything is there. For instance.
INITIAL_ARGS = set(['a','b','c','d','e'...])
def __init__(self, **kwargs):
if not INITIAL_ARGS.issubset(set(kwargs.iterkeys())):
raise ValueError("Class <myclass> requires 20 keyword arguments"
"only given %d" % len(kwargs))
self.__dict__.update(kwargs)
, Pythonic, , , , , -, , .