2016-03-24 11 views
0

Also, ich schreibe eine kleine Backup-Lösung, die einige Konfigurationseinstellungen aus einer YAML-Datei lädt. Ich möchte dem Benutzer erlauben, ein Benennungsschema für das generierte Backup festzulegen. Etwas wie:Dynamische Felder in einer Python-Zeichenfolge

{database_name} @ {host} {month}_{year}

und es ihnen ermöglichen Felder frei wählen aus einem Satz. Das erste, was mir in den Sinn kommt, wenn ich darüber nachdenke, wie man dies in eine letzte Zeichenkette umwandelt, ist die format Methode der Zeichenkette.

Der Code würde dann nach jedem möglichen Feld suchen und wenn es existiert, die Zeichenfolge entsprechend formatieren. Ich frage mich jedoch, ob es eine pythischere Methode gibt, diese zu umgehen, als nur durch die Zeichenfolge zu gehen, nach jedem möglichen Feld zu suchen und den Wert zu ersetzen.

+0

Warum sollte es "jedes mögliche Feld prüfen"? In der Regel werden Vorlagen (einschließlich Format-from-Dictionary) die zu ersetzenden Felder nach einem Satz von Regeln analysieren. – user2864740

+0

Da der Benutzer ein oder mehrere Felder aus einem Set – FBidu

+0

verwenden könnte, vielleicht 'Grep' die verwendeten Felder und ersetzen sie? – FBidu

Antwort

3

Erstellen Sie einfach ein Wörterbuch fields mit allen Feldern, die Sie unterstützen möchten, und anwenden, das Wörterbuch mit der **keywords Aufruf-Syntax:

filename = template.format(**fields) 

Die Vorlage kann so viele oder so wenige dieser Felder verwenden, wie es erfordert .

Demo:

>>> fields = {'foo': 'The Foo value', 'bar': 'A barren area', 'spam': 'The greatest canned meat!', 'eggs': 'scrambled or easy over?'} 
>>> template = 'Please provide me with eggs, {eggs}' 
>>> template.format(**fields) 
'Please provide me with eggs, scrambled or easy over?' 

In diesem Beispiel wird die Vorlage nur verwendet das egg Feld, die anderen verfügbaren Namen nicht verwendet werden, sondern sind auch für andere Vorlagen zur Verfügung.

Wenn Sie jemals tun müssen alle Feldnamen aufzulisten, verwenden Sie einen string.Formatter() instance die Felder parsen:

>>> from string import Formatter 
>>> list(Formatter().parse('{foo} {bar:042d}')) 
[('', 'foo', '', None), (' ', 'bar', '042d', None)] 

Die Formatter.parse() method Ausbeuten (literal_text, field_name, format_spec, conversion) Tupel.

+0

Wow, danke! Ich dachte wirklich, das würde mir einen Fehler für das Werfen von Argumenten geben, die nicht unbedingt verwendet werden. Danke – FBidu

+2

@FBidu: immer testen Sie Ihre Hypothesen! Beachten Sie, dass weder die ['str.format()' Methodendokumentation] (https://docs.python.org/2/library/stdtypes.html#str.format) noch die [Formatstring Syntaxdokumentation] (https://docs.python.org/2/library/string.html#formatstrings) geben an, dass alle Argumente verwendet werden müssen. –

+0

Ja, ich war wirklich rücksichtslos zu diesem Schluss zu springen. Danke für die gründliche Antwort: D – FBidu

Verwandte Themen