Durch das Ignorieren von nicht verwendeten Argumenten können beliebige Formatzeichenfolgen für Wörterbücher oder Objekte beliebiger Größe erstellt werden.
Angenommen, Sie wollten Ihrem Programm die Möglichkeit geben, den Endbenutzer die Ausgabe ändern zu lassen. Sie dokumentieren, welche Felder verfügbar sind, und weisen Benutzer an, diese Felder in {...}
Slots in einer Zeichenfolge zu platzieren. Der Endbenutzer kann dann Templating-Strings mit einer beliebigen Nummer der verwendeten Felder erstellen, einschließlich Null, ohne Fehler.
Mit anderen Worten, die Wahl ist bewusst, weil es praktische Gründe gibt, mehr Argumente zuzulassen als konvertiert werden. Beachten Sie, dass die C# String.Formatter
Implementierung, die den Python PEP inspiriert hat, aus denselben Gründen dasselbe tut.
Nicht, dass die Diskussion über diesen Teil der PEP so klar ist; Guido van Rossum an einem gewissen Punkt tries to address this issue:
Der PEP erscheint stumm auf dem, was passiert, wenn es zu wenig oder zu vielen Positionsargumente, oder wenn es fehlt oder nicht verwendete Schlüsselwörter. Fehlende sollten Fehler sein; Ich bin mir nicht sicher über überflüssige (unbenutzte) Einsen. Auf der einen Seite beschwert uns über diese gibt uns mehr Sicherheit , dass die Formatzeichenfolge korrekt ist. Auf der anderen Seite gibt es einige Anwendungsfälle für die Weitergabe von vielen Schlüsselwortparametern (z. B. einfaches Web Templating könnte eine feste Menge von Variablen mit ** dict übergeben). Auch in i18n (Übersetzung) apps ich die Nützlichkeit so dass nicht verwendete Parameter sehen konnte
, an dem der PEP Autor responded, dass sie in diesem Punkt noch unentschlossen waren.
Für Anwendungsfälle, in denen Sie eine Ausnahme für nicht verwendete Argumente auslösen müssen, wird erwartet, dass Sie die string.Formatter()
class ableiten und eine Implementierung für Formatter.check_unused_args()
bereitstellen; Die Standardimplementierung tut nichts. Dies hilft natürlich nicht Ihrem Freund Fall, wo Sie str.format(*args, **kwargs)
statt Formatter().format(str, *args, **kwargs)
verwendet haben. Ich glaube, dass bei irgendeinen Punkt die Idee war, dass Sie den von str.format()
verwendeten Formatierer mit einer kundenspezifischen Implementierung ersetzen konnten, aber das kam nie zustande.
Wenn Sie die flake8
linter verwenden, dann können Sie die flake8-string-format
plugin fügen Sie die offensichtlichen Fälle zu erfassen, in dem Sie in einem expliziten Stichwort Argument übergeben, die von dem Format-String nicht verwendet wird.
Möchten Sie etwas Einfaches wie: ''{6} {3}'. Format (* range (100))' fail? Oder vielleicht: ''Hallo {Name} Ihre Lieblingsfarbe ist {Farbe}. Format (Name =' Bob ', Farbe =' Blau ', Alter = 21, Planet =' Erde ')' –
@ JonClements Eigentlich ja. Wenn die Saite "Name" und "Farbe" benötigt, glaube ich, dass es ein Fehler ist, sie "Alter" und "Planet" zu übergeben. Wie bereits erwähnt, sollten "Fehler nicht lautlos passieren". Ein Fehler würde auch dazu führen, dass Sie Ihre Aussagen explizit angeben. –
Also, wenn ich ein 'dict' namens' person' habe, das ich herumgereicht habe und einfach eine Zeichenkette basierend auf bestimmten Elementen davon ausdrucken, sollte ich dafür verantwortlich sein ** das ** dict ** zu unterteilen, um zu meiner Formatierung zu passen? Das ist eine wahnsinnige Anforderung - oder glaubst du, dass die Leute wirklich Lust haben, '.format (name = person ['name'], color = ['person'])'? –