Zunächst einmal weiß ich nicht, ob es sehr klug ist, dies zu tun. Angenommen, eine Person ruft folgende Funktion auf:
Wie Sie sehen können, enthält das Tupel zwei Elemente. Aber jetzt aus irgendeinem Grund ruft die Person, die sie mit nur einem Element (weil beispielsweise der Generator nicht zwei Elemente erzeugt haben):
f(*((1,4),))
Dann würde der Benutzer wahrscheinlich Ihre Funktion, dies zu melden, aber jetzt wird es akzeptiere es einfach (was zu einem komplizierten und unerwarteten Verhalten führen kann). Okay, das Drucken der Elemente wird natürlich nicht viel schaden. Aber in einem allgemeinen Fall könnten die Konsequenzen schwerwiegender sein.
Trotzdem ein eleganter Weg, dies zu tun, um eine einfache Dekorateur macht dass zuerst überprüft, ob ein Element gespeist wird es überprüft, ob ein Tupelelement feeded ist und wenn ja, dehnt er sich: es
def one_tuple(f):
def g(*args):
if len(args) == 1 and isinstance(args[0],tuple):
return f(*args[0])
else:
return f(*args)
return g
und anwenden auf Ihre f
:
@one_tuple
def f(*args):
if len(args) == 2:
print args[0],args[1]
else:
raise Exception("wrong number of arguments")
Der Dekorateur one_tuple
somit überprüft, ob ein Tupel zugeführt wird, und wenn ja auspackt es für Sie b bevor Sie es an Ihre f
Funktion übergeben.
Als Ergebnis f
nicht den Tupel Fall in Rechnung zu tragen hat: es wird immer erweitert Argumente zugeführt werden und diese behandelt (natürlich das Gegenteil so gut gemacht werden könnte).
Der Vorteil der Definition eines Dekorators ist seine Wiederverwendung: Sie können diesen Dekorator auf alle Arten von Funktionen anwenden (und machen es so einfacher, diese zu implementieren).
Was (außer Einrückung) ist falsch mit dem, was Sie geschrieben haben? –
Ich würde argumentieren, dass es wahrscheinlich nicht klug ist, Ihre Funktion auf diese Weise polymorph zu machen ... Aber andere stimmen vielleicht nicht überein. – mgilson
Um @gmilson wiederzugeben, wenn Ihre Funktion zwei Werte erwartet, deklarieren Sie sie so, dass sie zwei Werte annehmen. Wenn ein Aufrufer ein 2-Tupel hat, kann er immer 'f (* (1,2))' 'verwenden. Bücken Sie sich nicht nach hinten, um die erwartete Nutzung zu berücksichtigen, wenn sie die erwartete Nutzung verdeckt. – chepner