Voici ma solution par les décorateurs:
def showargs(function):
def inner(*args, **kwargs):
return function((args, kwargs), *args, **kwargs)
return inner
@showargs
def some_func(info, arg1, arg2, arg3=1, arg4=2):
print arg1,arg2,arg3,arg4
return info
In [226]: some_func(1,2,3, arg4=4)
1 2 3 4
Out[226]: ((1, 2, 3), {'arg4': 4})
Il peut y avoir un moyen de nettoyer cette place plus loin, mais cela me semble peu intrusive et ne nécessite aucune modification du code d'appel.
Edit: Pour tester réellement si args particulières ont été adoptées par mot-clé, puis faire quelque chose comme ce qui suit à l'intérieur de some_func:
args, kwargs = info
if 'arg4' in kwargs:
print "arg4 passed as keyword argument"
Avertissement: vous devriez probablement envisager si vous vraiment ou non comment les arguments ont été passés. Toute cette approche peut être inutile.
Je ne pense pas ... pourquoi s'embêter avec ** kw alors? – jldupont
Je suis désolé, mais si c'est juste votre curiosité, je suis en train de voter pour fermer, il n'y a pas vraiment de problème, pas de cas d'utilisation, et personne n'aura jamais de problème dont vous rêvez. – SilentGhost
En fait, j'ai rencontré ce problème une fois. J'écrivais une fonction pour générer un wrapper XML (ajouter une balise start et ajouter une balise end) autour de CDATA, et je voulais que ça ressemble à 'def wrap (balise, contenu = None, ** attrs):', mais ensuite a couru tête baissée dans le problème que les attributs peuvent avoir des caractères que les identifiants Python ne peuvent pas. Mais c'était un exercice intéressant pour quelques minutes. –