Ist ein String-Formatierer, der Variablen aus seinem aufrufenden Bereich ableitet, eine schlechte Methode?

8

Ich habe etwas Code, der eine Menge String-Formatierungen macht. Oft habe ich am Ende Code mit folgenden Zeilen:

%Vor%

Wo ich versuche, eine große Anzahl von Variablen in eine große Zeichenfolge zu interpolieren.

Gibt es einen guten Grund, keine Funktion wie diese zu schreiben, die das Modul inspect verwendet, um zu interpolierende Variablen zu finden?

%Vor%     
Eric 09.11.2012, 16:42
quelle

4 Antworten

8

Ein einfacherer und sicherer Ansatz wäre der folgende Code. inspect.currentframe ist nicht bei allen Implementierungen von Python verfügbar, sodass der Code unterbrochen wird, wenn dies nicht der Fall ist. Unter jython, ironpython oder pypy ist es vielleicht nicht verfügbar, weil es eine Cpython-Sache zu sein scheint. Dies macht Ihren Code weniger portabel.

%Vor%

Diese Technik wird im Kapitel Python-Lernprogramm

beschrieben
  

Dies könnte auch geschehen, indem Sie die Tabelle als Schlüsselwortargumente mit übergeben   die Notation **. Dies ist besonders nützlich in Kombination mit der   neue integrierte vars () -Funktion, die ein Wörterbuch mit enthält   alle lokalen Variablen.

auch in den Python-Dokumenten für inspect.currentframe

  

CPython-Implementierungsdetail: Diese Funktion basiert auf Python-Stack   Frame-Unterstützung im Interpreter, für die nicht garantiert wird   alle Implementierungen von Python. Wenn in einer Implementierung ohne ausgeführt wird   Python Stack Frame unterstützt diese Funktion gibt None zurück.

    
Marwan Alsabbagh 09.11.2012 16:48
quelle
4

Update: Python 3.6 hat diese Funktion (eine leistungsfähigere Variante) eingebaut:

%Vor%

Siehe PEP 0498 - String-Interpolation

Es [manuelle Lösung] führt zu etwas überraschendem Verhalten mit verschachtelten Funktionen:

%Vor%

Hinweis: Derselbe Aufruf ist erfolgreich oder schlägt fehl, je nachdem, ob eine Variable oberhalb oder unterhalb davon erwähnt wird.

Wo callerscope ist:

%Vor%     
jfs 09.11.2012 17:57
quelle
3

Der gute alte Mailer hat eine Funktion _ , die genau das macht:

%Vor%

Wenn Barry Warschau das kann, warum können wir das nicht?

    
georg 09.11.2012 17:27
quelle
2

% inspect ist im Modul currentframe wie folgt definiert:

%Vor%

Wenn also sys kein _getframe -Attribut hat, funktioniert die interpolate -Funktion nicht.

Die Dokumentation für sys._getframe say:

  

CPython-Implementierungsdetail: Diese Funktion sollte verwendet werden für   nur interne und spezialisierte Zwecke. Es ist nicht garantiert zu existieren   in allen Implementierungen von Python.

Schreiben

%Vor%

im Funktionskörper ist nicht viel länger als

%Vor%

und Ihr Code wird portabler.

    
unutbu 09.11.2012 16:57
quelle

Tags und Links