Я хочу поймать исключение, но только если оно исходит от следующего уровня логики.
Цель состоит в том, чтобы обрабатывать ошибки, вызванные вызовом функции с неправильным числом аргументов, без маскировки ошибок, сгенерированных реализацией функции.
Как я могу реализовать функцию неправильные_аргументы
ниже?
Пример:
try:
return myfunc(*args)
except TypeError, error:
#possibly wrong number of arguments
#we know how to proceed if the error occurred when calling myfunc(),
#but we shouldn't interfere with errors in the implementation of myfunc
if wrong_arguments(error, myfunc):
return fixit()
else:
raise
Дополнение:
Есть несколько решений, которые хорошо работают в простом случае, но ни один из текущих ответов не поможет работают в реальном случае с декорированными функциями.
Учтите, что это возможные значения myfunc
выше:
def decorator(func):
"The most trivial (and common) decorator"
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
def myfunc1(a, b, c='ok'):
return (a, b, c)
myfunc2 = decorator(myfunc1)
myfunc3 = decorator(myfunc2)
Даже консервативный метод просмотра перед прыжком (проверка спецификации аргумента функции) здесь не работает, так как большинство декораторов будут иметь argspec of * args, ** kwargs
независимо от декорированной функции. Проверка исключений также кажется ненадежной, поскольку myfunc .__ name __
будет просто «оболочкой» для большинства декораторов, независимо от имени основной функции.
Есть ли хорошее решение, если функция может иметь или не иметь декораторов?