перехватить исключение с неверными аргументами, в общем случае

Я хочу поймать исключение, но только если оно исходит от следующего уровня логики.

Цель состоит в том, чтобы обрабатывать ошибки, вызванные вызовом функции с неправильным числом аргументов, без маскировки ошибок, сгенерированных реализацией функции.

Как я могу реализовать функцию неправильные_аргументы ниже?

Пример:

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 __ будет просто «оболочкой» для большинства декораторов, независимо от имени основной функции.

Есть ли хорошее решение, если функция может иметь или не иметь декораторов?

5
задан bukzor 28 February 2015 в 20:07
поделиться