2015-03-13 14 views
6

Voglio formattare una stringa ed essere in grado di utilizzare l'operatore punto, in modo da poter costruire stringhe di template contenenti ad es. {user.name}, {product.price}.Come usare un punto in stringhe in formato Python?

ho provato questo:

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

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

C'è un modo per farlo?

risposta

7

Gli oggetti Python dict sfortunatamente non sono accessibili (ad esempio con la notazione a punti) per impostazione predefinita. Così è possibile da soli rassegnarsi alla più brutta parentesi notazione:

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

Oppure si può avvolgere i vostri dati in un oggetto dot-accessibile. Esistono alcune classi di dizionario accessibili dagli attributi che è possibile installare da PyPI, ad esempio stuf.

from stuf import stuf 

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

ho tendono a mantenere le mie collezioni in stuf oggetti in modo che possa facilmente accedere per attributo.

+0

Qual è 'stuf'? – jonrsharpe

+0

'stuf' è una sottoclasse' dict' accessibile agli attributi. Vedi il collegamento alla descrizione completa del modulo. –

+0

Ah, capisco; pulito! – jonrsharpe

1

Il cambiamento minimo è quello di utilizzare le parentesi quadre nel modello, piuttosto che un periodo:

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

In alternativa, mettere gli oggetti che in realtà hanno quell'attributo nel dizionario, per esempio una classe personalizzata o collections.namedtuple:

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


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

Si noti inoltre che se si sta scrivendo la letterale si può semplicemente utilizzare un argomento parola chiave:

>>> 'Hello {user.name}'.format(user=User('Markus')) 
'Hello Markus' 
Problemi correlati