Ist es Pythonic, Methodenüberladung nachzuahmen?

8

Ist es pythonisch, Methodenüberladung nachzuahmen, wie sie in statisch getippten Sprachen vorkommt? Damit meine ich das Schreiben einer Funktion, die die Typen ihrer Argumente überprüft und sich je nach diesen Typen anders verhält.

Hier ist ein Beispiel:

%Vor%     
hwiechers 04.09.2010, 14:51
quelle

5 Antworten

13

Nicht sehr Pythonic, außer vielleicht, in 2.6 oder besser, wenn all die Checks auf die neuen abstrakten Basisklassen angewiesen sind, die teilweise genau dies ermöglichen sollen benutzen. Wenn du dich jemals für konkrete Klassen typenscheckst, dann kennst du deinen Code zerbrechlich und schränkt seine Verwendung ein.

Also zum Beispiel, ob Sie eine Instanz von Nummern haben.Integral ist es nicht schade - das neue ABC existiert zu einem guten Teil genau, um diese Überprüfung zu erleichtern. Prüfe, ob du eine Instanz von int hast, ist ein Desaster und schließt long , gmpy.mpz und eine ganze Reihe anderer integerähnlicher Zahlen aus, um überhaupt keinen guten Zweck zu haben: schau niemals nach konkreten Klassen!

Strings sind ein schwieriger Fall, aber die Basestring abstrakte Klasse (nicht eine von die neue Art von ABCs) ist eine Möglichkeit. Ein bisschen zu restriktiv, vielleicht, aber wenn du andere ABCs dafür verwendest, könnte es irgendwie funktionieren, wenn du wirklich musst. Auf jeden Fall nicht str - warum sollten Sie unicode ?!

ausschließen?     
Alex Martelli 04.09.2010, 15:15
quelle
13

Nicht wirklich, da Sie die Fähigkeit verlieren, Typen zu verwenden, die nicht ganz, aber nahe genug sind. Erstellen Sie stattdessen zwei separate Methoden ( find_by_name() und find_by_number() ).

    
Ignacio Vazquez-Abrams 04.09.2010 14:55
quelle
5

Nein, die Überprüfung hier ist nicht Pythonic. Eine weitere Option, wenn Sie nicht mehrere Methoden bevorzugen, ist, bei einer Methode zu bleiben, aber mehrere Parameter zu verwenden:

%Vor%

Bei Verwendung ist die Absicht so offensichtlich wie bei mehreren Methoden:

%Vor%     
Scott Griffiths 05.09.2010 14:54
quelle
2

Ich würde ja sagen, es ist "Pythonic" Und es gibt Beispiele, die dies unterstützen (was die anderen Poster nicht gegeben haben). Um dies richtig zu beantworten, sollte es Beispiele geben!

Aus Python-Kern:

  • string.startswith() Es akzeptiert entweder einen String oder ein Tupel (von Strings).
  • string.endswith()

In pymongo:

  • find_one() akzeptiert entweder ein zu suchendes dict-Objekt oder ein anderes Objekt als ID.

Tut mir leid, ich weiß nicht mehr, aber ich denke, es gibt VIELE Beispiele für Methoden, die sich je nach den angegebenen Parametern unterschiedlich verhalten. Das ist Teil der Schönheit, Typen nicht durchzusetzen.

    
Amala 05.09.2010 01:31
quelle
1

Eine pythischere Art, zu dieser Art von Funktionalität zu gelangen, besteht darin, sie einfach in der bevorzugten Weise zu benutzen (was auch immer das bedeuten mag) und wenn das Argument das nicht unterstützt, versuchen Sie eine Alternative.

Hier zwei Möglichkeiten, das zu tun:

%Vor%

aber das ist irgendwie eklig. So mache ich das normalerweise:

%Vor%

In der Realität hängt das tatsächliche Attribut, nach dem ich suchen möchte, davon ab, was in diesen Kommentaren passiert. Ich würde lieber nach einem Attribut suchen, das ich tatsächlich verwende.

    
quelle

Tags und Links