L'analyse des arguments et kwargs dans les décorateurs

J'ai une fonction qui prend en arguments et kwargs, et j'ai besoin de faire quelque chose dans ma décorateur basé sur la valeur de la 2e arg dans la fonction, comme dans le code ci-dessous:

def workaround_func():
    def decorator(fn):
        def case_decorator(*args, **kwargs):
            if args[1] == 2:
                print('The second argument is a 2!')
            return fn(*args, **kwargs)
        return case_decorator
    return decorator

@workaround_func()
def my_func(arg1, arg2, kwarg1=None):
    print('arg1: {} arg2: {}, kwargs: {}'.format(arg1, arg2, kwarg1))

Le problème est que python permet aux utilisateurs d'appeler la fonction avec le deuxième argument comme un régulier d'un argument OU d'un mot-clé-argument, donc si l'utilisateur appelle my_func avec arg2 comme un kwarg, il soulève une IndexError, voir ci-dessous:

In [8]: d.my_func(1, 2, kwarg1=3)
The second argument is a 2!
arg1: 1 arg2: 2, kwargs: 3

In [9]: d.my_func(1, arg2=2, kwarg1=3)
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-9-87dc89222a9e> in <module>()
----> 1 d.my_func(1, arg2=2, kwarg1=3)

/home/camsparr/decoratorargs.py in case_decorator(*args, **kwargs)
      2     def decorator(fn):
      3         def case_decorator(*args, **kwargs):
----> 4             if args[1] == 2:
      5                 print('The second argument is a 2!')
      6             return fn(*args, **kwargs)

IndexError: tuple index out of range

Est-il un moyen de contourner cela sans faire juste un try/except et attraper le IndexError?

OriginalL'auteur Cameron Sparr | 2013-09-19