Beginnend mit Python 3.6 ist der Effekt von %code% bereits in %code% oder besser "formatierten String-Literalen" enthalten.
Siehe auch PEP 498 und Python 3.6-Versionshinweise .
Ich verwende normalerweise das folgende Muster (wie in diese Frage ):
%Vor%Ich denke, es ist eine gute Möglichkeit, leicht lesbaren Code zu schreiben.
Manchmal ist es sinnvoll, String-Formate zu "verketten", um die Erstellung komplexer Strings zu "modularisieren":
%Vor% Sehr bald wird der Code mit X.format(**locals())
belästigt.
Um dieses Problem zu lösen, habe ich versucht, ein Lambda zu erstellen:
, aber dies wirft einen KeyError, da locals()
die Locals von Lambda sind.
Ich habe auch versucht, das Format nur auf die letzte Zeichenfolge anzuwenden:
%Vor%Aber das funktioniert nicht, da Python nur einmal formatiert. Nun konnte ich eine Funktion schreiben, die wiederholt formatiert, bis nichts mehr zu tun ist:
%Vor%Aber ich frage mich: Gibt es einen besseren Weg, dies zu tun?
f = lambda x, l=locals(): x.format(**l)
scheint zu funktionieren ...
und wenn du eine Version haben wolltest, die etwas umfassender ist (und wahrscheinlich viel langsamer):
%Vor%findet die Symbole entweder in Locals oder in Globals.
Wenn Sie dies nur innerhalb des Funktionsumfangs als lokale Verknüpfung ausführen müssen, funktioniert Folgendes:
%Vor% Dies bindet jedoch den von locals()
zurückgegebenen Wert zum Zeitpunkt der Funktionsdeklaration und nicht zur Ausführung. Daher wird er nicht aktualisiert, wenn sich Werte ändern, noch ist er nützlich, wenn er aus einem anderen Bereich aufgerufen wird.
Wenn Sie Zugriff auf die locals
der aufrufenden Methode erhalten möchten, müssen Sie inspect
die Aufrufliste ( Ссылка )
Beachten Sie, dass dies möglicherweise nicht für Implementierungen von Python funktioniert, die nicht CPython sind.
Jetzt können Sie tun:
%Vor%Ich verwende normalerweise das folgende Muster (wie in diese Frage ):
%Vor%Ich denke, es ist eine gute Möglichkeit, leicht lesbaren Code zu schreiben.
Manchmal ist es sinnvoll, String-Formate zu "verketten", um die Erstellung komplexer Strings zu "modularisieren":
%Vor% Sehr bald wird der Code mit **locals()
belästigt.
Um dieses Problem zu lösen, habe ich versucht, ein Lambda zu erstellen:
, aber dies wirft einen KeyError, da string#format
die Locals von Lambda sind.
Ich habe auch versucht, das Format nur auf die letzte Zeichenfolge anzuwenden:
%Vor%Aber das funktioniert nicht, da Python nur einmal formatiert. Nun konnte ich eine Funktion schreiben, die wiederholt formatiert, bis nichts mehr zu tun ist:
%Vor%Aber ich frage mich: Gibt es einen besseren Weg, dies zu tun?
%code% scheint zu funktionieren ...
und wenn du eine Version haben wolltest, die etwas umfassender ist (und wahrscheinlich viel langsamer):
%Vor%findet die Symbole entweder in Locals oder in Globals.
Es ist kein One-Liner, aber es funktioniert:
%Vor%Hier ist eine rekursive Version mit einer Zeile (und etwas weniger effizient):
%Vor%Beginnend mit Python 3.6 ist der Effekt von %code% bereits in %code% oder besser "formatierten String-Literalen" enthalten.
Siehe auch PEP 498 und Python 3.6-Versionshinweise .
Wenn Sie dies nur innerhalb des Funktionsumfangs als lokale Verknüpfung ausführen müssen, funktioniert Folgendes:
%Vor%Dies bindet jedoch den von %code% zurückgegebenen Wert zum Zeitpunkt der Funktionsdeklaration und nicht zur Ausführung. Daher wird er nicht aktualisiert, wenn sich Werte ändern, noch ist er nützlich, wenn er aus einem anderen Bereich aufgerufen wird.
Wenn Sie Zugriff auf die %code% der aufrufenden Methode erhalten möchten, müssen Sie %code% die Aufrufliste ( Ссылка )
%Vor%Beachten Sie, dass dies möglicherweise nicht für Implementierungen von Python funktioniert, die nicht CPython sind.
Jetzt können Sie tun:
%Vor%Tags und Links python string lambda scope string-formatting