Wie kann ich Schlüsselwörter aus einer Python-Formatzeichenfolge extrahieren?

8

Ich möchte eine automatische Zeichenfolgenformatierung in einer API wie folgt bereitstellen:

%Vor%

kann durch die Werte von Attributen ersetzt werden, die in der Formatierungszeichenfolge aufgerufen werden.

Wie extrahiere ich die Schlüsselwortargumente aus einer Python-Format-Zeichenfolge:

%Vor%     
Jace Browning 23.09.2014, 13:52
quelle

4 Antworten

29

Sie können die string.Formatter() -Klasse verwenden, um die Felder in a auszuwerten string mit der Methode Formatter.parse() :

%Vor%

Demo:

%Vor%

Sie können diese Feldnamen weiter analysieren; Dafür können Sie die Funktion str._formatter_field_name_split() (Python 2) / _string.formatter_field_name_split() (Python 3) verwenden (dieses interne Implementierungsdetail ist nicht anderweitig verfügbar; Formatter.get_field() verwendet es intern. Diese Funktion gibt den ersten Teil des Namens zurück, der in den an str.format() übergebenen Argumenten nachgeschlagen wird, sowie einen Generator für den Rest des Feldes.

Der Generator liefert (is_attribute, name) Tupel; is_attribute ist wahr, wenn der nächste Name als Attribut behandelt werden soll, false, wenn es sich um ein Element handelt, das mit obj[name] gesucht werden soll:

%Vor%

Demo:

%Vor%

Beachten Sie, dass diese Funktion Teil der internen Implementierungsdetails der Formatter() -Klasse ist und ohne vorherige Ankündigung geändert oder aus Python entfernt werden kann und möglicherweise nicht einmal in anderen Python-Implementierungen verfügbar ist.

    
Martijn Pieters 23.09.2014, 13:58
quelle
3

Wenn alle Platzhalter benannt sind, kann ein spezielles Wörterbuch verwendet werden, um abzufangen, auf welche Schlüssel versucht wird, auf ein Array zuzugreifen und es zu protokollieren.

%Vor%

Beachten Sie, dass bei unbenannten Platzhaltern ein IndexError um .format() (Tupelindex außerhalb des gültigen Bereichs) ausgelöst wird.

    
CoDEmanX 25.08.2016 19:18
quelle
1

Nach Martijns Antwort ist ein einfacheres Format für die umfassende Liste, die ich verwendet habe:

%Vor%

Es ist funktional genau das Gleiche, nur viel einfacher zu verdauen.

    
MacMcIrish 09.08.2017 22:05
quelle
0

Sie können "path/to/{self.category}/{self.name}".format(self=self) ausführen. Du könntest also mit diesen Kwargen in __getattr__ arbeiten.

    
pacholik 23.09.2014 14:15
quelle