Недавно я столкнулся с "особенностью" Python, которую я нашел не очень хорошо продуманным: Python вызывает TypeError
если вызывается функция с неправильным числом аргументов. Я хотел бы понять, в чем причина этого выбора.
Более подробная информация: я нахожу, что настраиваю систему обратного вызова и, среди прочего, проверяю, может ли (пользовательский) обратный вызов принимать или не аргумент. Я должен проверить этот фронт, когда мне дают обратный вызов, потому что, если я просто делаю что-то вроде:
try:
call_the_callback(one_argument)
except TypeError:
call_the_callback()
except Exception:
do_something_else()
Я нахожу себя в неудобной ситуации ловли также TypeError
брошенного внутренней обработкой обратного вызова (возможно, он ожидал строку вместо целого числа или что-то еще), что я определенно должен различать.
В конце концов, я обошел это с проверкой следующим образом (думаю, это только для Python 3):
callsign = signature(action)
nargs = len(callsign.parameters)
а затем с помощью соответствующего вызова. Однако, помимо этой конкретной проблемы, я просто не могу понять, почему под тем же зонтиком вызывается звонок с неправильным количеством аргументов и, скажем, 1/"three"
.
ПРИМЕЧАНИЕ. Я понимаю, почему возникает ошибка при вызове с неправильным количеством аргументов, я определенно хочу этого! Моя проблема заключается в понимании того, почему TypeError
возникает, а не что-то более конкретное. Я хочу получить более глубокое понимание этого, чтобы лучше разработать стратегии для решения такой ситуации.
Ссылки:
Слишком общие, только о том, что вызов с неверным числом аргументов "какая - то TypeError
": Почему TypeError, когда слишком много/слишком мало арга в вызове функции Python
Обсуждает проблему, но не отвечает на вопрос: https://bytes.com/topic/python/answers/45841-incorrect-number-arguments
Я думаю, что почти все языки программирования имеют обязательные параметры для функции, и если эти параметры не получены, возникает исключение. Это полезно для обеспечения правильного использования этой функции. Если параметры функции не являются обязательными, вам нужно больше логики обработки внутри функции, чтобы охватить все случаи.
Но вы можете использовать необязательные параметры или общие параметры вместе с или без обязательных параметров. Например, bellow - это функция, которая позволяет вам иметь любое количество параметров (простые или ключевые параметры), а параметр не обязательно:
def f1(*args, **kwargs):
print args
print kwargs
f1(1,'param', a=4)
Для получения дополнительной информации см.: Generic function in python - вызов метода с неизвестным числом аргументов