Hier ist meine Lösung über Dekorateure:
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})
Es kann ein Weg sein, diese weiter zu bereinigen, aber dies scheint mir minimal aufdringlich und erfordert keine Änderung an den anrufenden Code.
Edit: Um tatsächlich zu testen, ob bestimmte Argumente nach Stichwort geben wurden, dann etwas tun, wie der folgende innerhalb von some_func:
args, kwargs = info
if 'arg4' in kwargs:
print "arg4 passed as keyword argument"
Haftungsausschluss: sollten Sie vielleicht überlegen, ob Sie wirklich interessieren wie die Argumente bestanden wurden. Dieser ganze Ansatz kann unnötig sein.
Ich glaube nicht ... warum sollte man sich dann mit ** kw kümmern? – jldupont
Es tut mir leid, aber wenn es nur deine Neugierde ist, die ich schließe, gibt es kein wirkliches Problem, keinen Anwendungsfall und niemand wird jemals ein Problem haben, von dem du träumst. – SilentGhost
Eigentlich bin ich einmal auf dieses Problem gestoßen. Ich schrieb eine Funktion, um einen XML-Wrapper zu generieren (ein Start-Tag voranzustellen und ein End-Tag anzufügen) um einige CDATA und wollte, dass es wie 'def wrap (tag, contents = None, ** attrs) aussieht:', aber dann lief kopfüber in das Problem, dass Attribute Zeichen haben können, die Python-Bezeichner nicht haben können. Aber es war eine interessante Übung für ein paar Minuten. –