Это выглядит хорошо для меня.
Если вы хотите абстрагировать эту логику от тела функции, вы можете поместить ее в декоратор:
def validate_num_args(num_args=None, num_kwargs=None):
def entangle(f):
def inner(*args, **kwargs):
if not num_args is None and len(args) > num_args:
raise ValueError("Too many arguments, got %s, wanted %s." % (len(args), num_args))
if not num_kwargs is None and len(kwargs) > num_kwargs:
raise ValueError("Too many keyword arguments, got %s, wanted %s." % (len(kwargs), num_kwargs))
return f(*args, **kwargs)
return inner
return entangle
@validate_num_args(num_args=3)
def foo(x, y, *args, **kwargs):
return "do something with these variables:", x, y, args, kwargs
print "Good:\n", foo(1,2,3)
print ""
print "Bad:\n", foo(1,2,3,4)
Вывод этого кода:
Good:
('do something with these variables:', 1, 2, (3,), {})
Bad:
Traceback (most recent call last):
File "c:\so.py", line 18, in <module>
print "Bad:\n", foo(1,2,3,4)
File "c:\so.py", line 5, in inner
raise ValueError("Too many arguments, got %s, wanted %s." % (num_args, len(args)))
ValueError: Too many arguments, got 4, wanted 3.