2015-03-13 23 views
6

我想格式化一個字符串並且能夠使用點運算符,以便我可以構造包含例如字符串的模板字符串。 {user.name}{product.price}如何在Python格式字符串中使用點?

我嘗試這樣做:

'Hello {user.name}'.format({'user': { 'name': 'Markus' } }) 
KeyError: 'user' 

'Hello {user.name}'.format(**{'user': { 'name': 'Markus' } }) 
AttributeError: 'dict' object has no attribute 'name' 

有沒有辦法做到這一點?

回答

7

Python dict不幸的是,對象在默認情況下不是屬性可訪問的(即使用點符號)。所以,你可以辭職自己的醜陋括號註釋:

'Hello {user[name]}'.format(**{'user': { 'name': 'Markus' } }) 

或者你可以在一個點訪問對象包裝你的數據。有幾個可從PyPI安裝的屬性可訪問字典類,如stuf

from stuf import stuf 

'Hello {user.name}'.format(**stuf({'user': { 'name': 'Markus' } })) 

我傾向於把我的藏品中stuf對象,這樣我可以很容易地通過屬性訪問它們。

+0

什麼是'stuf'? – jonrsharpe 2015-03-13 14:51:49

+0

'stuf'是屬性可訪問的'dict'子類。請參閱完整模塊描述的鏈接。 – 2015-03-13 14:54:49

+0

啊,我明白了;整齊! – jonrsharpe 2015-03-13 15:05:59

1

的最小變化是在模板中使用方括號,而不是句:

   # v Note 
>>> 'Hello {user[name]}'.format(**{'user': {'name': 'Markus'}}) 
'Hello Markus' 

或者,把那個實際上有屬性在字典中的對象,例如自定義類或collections.namedtuple

>>> class User(object): 
    def __init__(self, name): 
     self.name = name 


>>> 'Hello {user.name}'.format(**{'user': User('Markus')}) 
'Hello Markus' 

還要注意的是,如果你寫出來的文字,你可以只用一個關鍵字參數:

>>> 'Hello {user.name}'.format(user=User('Markus')) 
'Hello Markus' 
相關問題