Warum wird die Formatierungsmethode in Python nicht häufiger verwendet?

8

Ich vermisse hier wahrscheinlich etwas, nachdem ich gesucht habe, konnte ich keine Antwort finden.

Ich habe einige Python-Projekte untersucht und eine Sache, die mir immer wieder auffällt, ist die Tatsache, dass die meisten von ihnen weiterhin den %Operator zum Formatieren von Zeichenfolgen verwenden und nicht die neuere, empfohlene .format()Methode. Gibt es einen Grund dafür? Es scheint eine triviale Veränderung zu sein, es sei denn, ich vermisse etwas völlig.

Zum Beispiel:

# count how many times the % operator technique is used
find . -name "*.py" -exec grep -HE "\"[^\"]+\"\s\%\s\w+|'[^']+'\s\%\s\w+" {} \; | wc -l

# and the same for format()
find . -name "*.py" -exec grep -HE "\w+\.format\(" {} \; | wc -l

# Results:
#
#               % operator        format()
# iPython          670               63
# Django           977               8
# Tornado          91                0
# requests         25                1

Kein wirklicher Grund für diese Frage, nur neugierig.

Prost!

Matt
quelle
2
Die Leute tippen gerne weniger und haben auch Code, der geschrieben wurde, bevor es eine .format()Methode gab?
Wooble
FWIW, das alte %ist effizienter und weniger ausführlich für einfaches Ersetzen von Zeichenfolgen. Ich benutze es meistens und wenn ich eine leistungsfähigere Formatierung benötige, gehe ich zu.format
bgusach

Antworten:

16

Drei extrem starke Neigungen kommen zusammen, um diesen Effekt hervorzurufen:

  1. Komfort: "Ich weiß, wie man das auf die alte Art macht. Das Erlernen der neuen Art wäre mehr Aufwand."
  2. Kompromiss zwischen Aufwand und Wirkung: "Ist die alte Methode weg? Ist sie überhaupt veraltet? Nein? Dann gibt es überhaupt keinen Geschäftsfall, um dies zu ändern. Erstellen Sie stattdessen neuen Code."
  3. Sicherheit: "Sind Sie sicher, dass die vorgeschlagene neue Vorgehensweise genau gleichwertig ist? Nein? Dann lassen Sie den alten Code besser so wie er ist - Sie könnten Fehler einführen."

Alle drei sind in der Tat durchaus vernünftig (der erste zumindest, da kontinuierliches Lernen das ist, wovon Informationsarbeiter leben sollten).

( Bearbeiten: Wie unten ausgeführt, gibt es einen vierten Punkt: Nicht zu wissen, dass die neue Methode überhaupt existiert! Dies ist weniger sinnvoll, könnte aber tatsächlich die häufigste sein.)

Kilian Foth
quelle
4
+1 gibt es vielleicht 4. Unwissenheit, dass es sogar einen neuen Weg gibt
jk.
1
@jk. +1 Ich wusste nicht, dass format () existiert.
Joe Z.
+1, aber schließen Sie diesen 4. Punkt ein. Ich bemerke immer wieder auf SO, dass Menschen , wenn ich die .format()Methode oder format()Funktion zeige , einfach nicht wissen, dass sie existieren .
Martijn Pieters
1
Ich würde hinzufügen , dass formatist nicht ein Äquivalent %. Zum Beispiel verwenden %Sie verwenden können , *die minimale Feldbreite (zB angeben '%.*f' % (7, 2.34)Formate der Schwimmer 2.34mit mindestens 7Ziffern), während sie mit formatIhnen nicht , kann dies zu tun. Und wahrscheinlich gibt es andere Dinge, formatdie tun können, während %sie nicht können.
Bakuriu
3
Gute Antwort. Auch @Bakuri ist es möglich mit format, es ist aber nicht so prägnant - "{0:.{1}f}".format(2.34, 7). Ich habe nichts gefunden, was %das formatnicht kann.
Matt
6

Zusätzlich zu den anderen Gründen würde ich Abwärtskompatibilität und Konsistenz hinzufügen. Oft müssen Sie Skripte schreiben, die auf den Computern anderer Benutzer ausgeführt werden können, die nicht bereit oder nicht in der Lage sind, auf das neueste und beste Python zu aktualisieren. Sie schreiben also auf den kleinsten gemeinsamen Nenner. Bis genug Benutzer auf eine ausreichend aktuelle Version von Python aktualisiert haben, haben Sie wahrscheinlich vergessen, welche Funktionen in welcher Version von Python enthalten sind. Wenn es sich nicht um außergewöhnlich wertvolle Funktionen handelt, lohnt es sich möglicherweise nicht, nachzuforschen, zu prüfen und zu entscheiden, ob die Verwendung der einzelnen Funktionen jetzt sicher ist. Die Methode format format ist eine nette API, die in neuem Code verwendet werden kann, aber der Fall, sie in eine Codebasis einzuführen, die% bereits in großem Umfang verwendet, ist nicht so stark.

Weeble
quelle
2

Wenn Sie Software für Ihren eigenen Gebrauch entwickeln, ist es häufig zu Ihrem Vorteil, neuere Versionen Ihrer Bibliotheken und Entwicklungstools zu verwenden. Bei den Projekten, die Sie sich ansehen, handelt es sich jedoch um Bibliotheken und Entwicklungstools, die für die Community freigegeben werden sollen. In diesen Fällen möchten Sie bei den Funktionen, die Sie benötigen, konservativ sein, um die breiteste installierte Basis zu erhalten und die meisten Personen in das Projekt einzubeziehen.

Die format()Methode wurde erst mit der Veröffentlichung von Python 3.0 / 2.6 im Jahr 2008 hinzugefügt. Das scheint lange her zu sein, aber denken Sie daran, dass Benutzer die erste Version von Software selten verwenden. Lassen Sie uns dies in den Kontext stellen, als es in zwei der "ernsthafteren" Linux-Distributionen verfügbar wurde. RHEL 5.x verwendet weiterhin Python 2.4 und wird bis 2017 unterstützt - 6.x hat Python 2.6, aber das wurde erst 2010 veröffentlicht. Im Debian-Camp hatten sie Python 2.6 erst in der 6.x-Serie, die stabil wurde 2011.

Wenn Sie also heute ein Projekt wie Django (ursprünglich 2005 veröffentlicht) starten, um die neue Methode zu standardisieren, ist es zwar sinnvoll, alle 1000 Vorkommen der alten Methode zu ändern, ohne dass dies der Fall ist formell veraltet. Es macht Arbeit, schafft die Möglichkeit, Fehler einzuführen und erhöht unnötig die Systemanforderungen.

Sean McSomething
quelle
0

Ergänzung zu @ KilianFoths Antwort; Das Portieren eines großen Projekts auf eine höhere Softwareversion hat zu viel Arbeit zu erledigen. Das Ändern einer nicht veralteten Nutzung hat im Upgrade-Prozess die geringste Bedeutung.

Wahrscheinlich verwenden sie ein neues Format in komplett neu geschriebenen Teilen und ändern im Übrigen nicht die bestehende Verwendung.

Gefallener Engel
quelle