2016-03-24 95 views
0

因此,我正在編寫一個小型備份解決方案,用於從YAML文件加載一些配置設置。我想讓用戶爲生成的備份設置一個命名方案。喜歡的東西:Python字符串中的動態字段

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

,並允許他們自由選擇從一組字段。考慮如何將其轉換爲最終字符串時,首先想到的是使用字符串的format方法。

代碼會檢查每個可能的字段,如果存在,請相應地設置字符串的格式。但是,我想知道,如果有更多的pythonic方法,不僅僅是循環遍歷字符串,檢查每個可能的字段並替換值。

+0

爲什麼需要'檢查每個可能的字段'?通常,模板(包括來自字典的格式)解析出這些字段以替換下面的一組規則。 – user2864740

+0

因爲用戶可以使用集合中的一個或多個字段 – FBidu

+0

也許'grep'用過的字段並替換它們? – FBidu

回答

3

只需創建一個字典fields所有你想要支持的領域,並使用**keywords調用語法應用該詞典:

filename = template.format(**fields) 

模板可以使用盡可能多或儘可能少的領域,因爲它需要。

演示:

>>> 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?' 

在此示例中,模板只使用egg場,不使用其他可用的名字,但可用於其他模板。

如果你在任何時候需要列出所有字段名,用string.Formatter() instance解析出字段:

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

Formatter.parse() method產量(literal_text, field_name, format_spec, conversion)元組。

+0

哇,謝謝!我真的認爲這會給我一個拋出不一定會被使用的參數的錯誤。謝謝 – FBidu

+2

@FBidu:總是測試你的假設!請注意,無論是['str.format()'方法文檔](https://docs.python.org/2/library/stdtypes.html#str.format)還是[格式字符串語法文檔](https:/ /docs.python.org/2/library/string.html#formatstrings)聲明必須使用所有參數。 –

+0

是的,我真的很魯莽跳到這一結論。感謝徹底的答案:D – FBidu