2011-10-28 58 views
7

假設我有一個帶有點的字典名稱的字典,如{'person.name': 'Joe'}。如果我想在str.format中使用這個,有可能嗎?python:格式字符串中變量的名稱中的點

我的第一反應是

'Name: {person.name}'.format(**{'person.name': 'Joe'}) 

但如果我的字典中形如

{'person':{'name':Joe}} 

The relevant manual docs section無論如何逃脫點並沒有提到這隻會工作。

(旁註:我認爲一般

def func(**kw): print(kw) 
func(**{'a.b': 'Joe'}) 

會導致錯誤,但** -expanded函數調用似乎即使他們不有效標識符來工作,它確實錯誤了! 。非字符串雖然O_O)

+0

你試過用反斜槓轉義點嗎? –

+0

@RafeKettler:是的。這不起作用,因爲你是爲字符串而不是格式說明符轉義的。 – nfirvine

+0

可能的重複[如何在Python格式字符串中使用點?](http://stackoverflow.com/questions/29035168/how-to-use-a-dot-in-python-format-strings) –

回答

5
'Name: {0[person.name]}'.format({'person.name': 'Joe'}) 
+0

Close但是這隻有在您使用單個密鑰傳遞字典時纔有效,每個位置替換一個密鑰。例如,這會失敗:''Name:{0 [person.name]} Age:{1 [person.age]}'。format({'person.name':'Joe','person.age':42 })' – jathanism

+2

但是你可以根據需要多次重複0次。這工作得很好:''Name:{0 [person.name]}年齡:{0 [person.age]}'。格式({'person.name':'Joe','person.age':42}) ' –

+0

太棒了,我不知道你可以做到這一點,我已經學到了一些東西。謝謝! :) – jathanism

3

之一來解決此方法是使用舊%格式(這還沒有被棄用尚):

>>> print 'Name: %(person.name)s' % {'person.name': 'Joe'} 
Name: Joe 
0

我有類似的問題,我從string.Formatter繼承解決了這個問題:

import string 

class MyFormatter(string.Formatter): 
    def get_field(self, field_name, args, kwargs): 
     return (self.get_value(field_name, args, kwargs), field_name) 

但是你不能用str.format(),因爲它仍然指向舊的格式,你需要去這樣

>>> MyFormatter().vformat("{a.b}", [], {'a.b': 'Success!'}) 
'Success!'