Funktion, die sowohl erweiterte Argumente als auch Tupel akzeptiert

8

Gibt es eine Pythonic Möglichkeit, eine Funktion zu erstellen, die sowohl separate Argumente als auch ein Tupel akzeptiert? um so etwas zu erreichen:

%Vor%     
B-K 27.01.2017, 16:22
quelle

3 Antworten

5

Zunächst weiß ich nicht, ob es sehr klug ist, das zu tun. Sagen Sie, eine Person ruft eine Funktion wie folgt auf:

%Vor%

Wie Sie sehen können, enthält das Tupel zwei Elemente. Aber aus irgendeinem Grund ruft die Person sie nur mit einem Element auf (weil der Generator zum Beispiel keine zwei Elemente erzeugt hat):

%Vor%

Dann würde der Benutzer wahrscheinlich möchten, dass Ihre Funktion dies meldet, aber jetzt akzeptiert es es einfach (was zu kompliziertem und unerwartetem 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.

Dennoch ist es eine elegante Methode, einen einfachen Decorator zu erstellen, der zuerst prüft, ob ein Element gespeist wird. Er prüft, ob ein Tupel-Element feed ist und erweitert es:

%Vor%

Und wenden Sie es auf Ihr f :

an %Vor%

Der Dekorator one_tuple überprüft also, ob ein Tupel gefüttert wird, und wenn dies der Fall ist, entpackt es für Sie, bevor es an Ihre f -Funktion übergeben wird.

Als Ergebnis muss f den Tupelfall nicht berücksichtigen : es wird immer erweiterte Argumente erhalten und diese behandeln (natürlich könnte auch das Gegenteil getan werden).

Der Vorteil der Definition eines Dekorators ist seine Wiederverwendung : Sie können diesen Dekorator auf alle Arten von Funktionen anwenden (und erleichtern damit die Implementierung).

    
Willem Van Onsem 27.01.2017, 16:26
quelle
3

Der Pythonic Weg würde die Eingabe von Enten sein. Dies funktioniert nur, wenn Sie sicher sind, dass keines der erweiterten Argumente iterierbar ist.

%Vor%

Diese Implementierung bietet eine leichte Verbesserung der Antwort von @ Ev.Kounis für Fälle, in denen ein einzelnes Nicht-Tupel-Argument übergeben wird. Es kann auch leicht in den von @WillemVanOnsem beschriebenen äquivalenten Dekorator umgewandelt werden. Verwenden Sie die Decorator-Version, wenn Sie mehr als eine Funktion wie diese haben.

    
Mad Physicist 27.01.2017 16:42
quelle
3

Ich stimme der Idee selbst nicht zu (obwohl ich die Tatsache mag, dass Python die Definition von Variablentypen nicht benötigt und somit so etwas erlaubt), aber es könnte Fälle geben, in denen so etwas benötigt wird. Also los gehts:

%Vor%

Restrukturierte es ein bisschen, aber die Logik bleibt gleich. Wenn "a" ein iterabler Wert ist, betrachten Sie es als Ihr Tupel, wenn Sie nicht auch "b" berücksichtigen. Wenn "a" nicht iterierbar ist und "b" nicht definiert ist, erhöhen Sie TypeError

%Vor%     
Ev. Kounis 27.01.2017 16:28
quelle

Tags und Links