Чтобы проверить, что все необходимые параметры передаются в вашу функцию, вы можете создать словарь, который отображает все необходимые параметры в None, а затем скопировать и обновить этот словарь в начале каждого метода.
needed_params = {'one': None, 'two': None, 'three': None}
def my_func(**kwargs):
params = needed_params.copy()
params.update(kwargs)
for key, value in params.iteritems():
if not value:
raise TypeError("You need to provide the argument %s" % key)
result = do_stuff_here
return result
Как отмечается в комментариях, вероятно, не очень хорошая идея возвращать "удобное для пользователя" описание. Вместо этого вы, вероятно, захотите вызвать ошибку, если параметр отсутствует. Тогда вы сможете обработать эту ошибку в другом месте вашего пользовательского интерфейса.
Киндалл предлагает декоратора. В зависимости от того, насколько сложным вы хотите, чтобы проверка была, я думаю, вы могли бы справиться с чем-то более простым, чем его предложение:
def check_needed_params(target):
needed_params = {'one': None, 'two': None, 'three': ''}
def wrapper(*args, **kwargs):
params = needed_params.copy()
params.update(kwargs)
for key, value in params.iteritems():
if not value:
raise TypeError("You need to provide the argument '%s'" % key)
return target(**params)
return wrapper
Вы можете использовать это, чтобы идентифицировать функции, для которых необходимо проверить свои параметры, следующим образом:
@check_needed_params
def adder(**kwargs):
return kwargs["one"] + kwargs["two"] + kwargs["three"]
Затем, когда эта функция вызывается, она будет работать без проблем, если вы предоставите все результаты, но вызовет ошибку, если вы этого не сделаете.
>>> adder(one=1, two=2, three=3)
6
>>> adder(one=1, two=2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "c:/Users/.../python-6940fCr.py", line 8, in wrapper
TypeError: You need to provide the argument three