2015-03-13 15 views
6

Chcę sformatować ciąg znaków i użyć operatora kropki, aby móc tworzyć ciągi szablonów zawierające np. {user.name}, {product.price}.Jak używać kropek w ciągach w formacie Python?

Próbowałem to:

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

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

Czy istnieje sposób to zrobić?

Odpowiedz

7

Obiekty Python dict są domyślnie niedostępne dla atrybutów (tj. Z notacją kropkową). Więc można albo pogódź się z brzydsze notacji nawiasie:

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

Można też owinąć swoje dane w obiekcie dot inwalidzkim. Dostępnych jest kilka klas słowników dostępnych dla atrybutów, które można zainstalować z poziomu PyPI, na przykład stuf.

from stuf import stuf 

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

staram się aby moje zbiory w stuf obiektów, dzięki czemu można łatwo uzyskać do nich dostęp przez atrybut.

+0

Co jest 'stuf'? – jonrsharpe

+0

'stuf' jest podklasą' dict', która jest dostępna dla atrybutów. Zobacz link do pełnego opisu modułu. –

+0

Ach, widzę; schludny! – jonrsharpe

1

Minimalna zmiana jest użycie nawiasów kwadratowych w szablonie, raczej niż przez okres:

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

Alternatywnie, umieścić przedmioty, które rzeczywiście mają tego atrybutu w słowniku, na przykład niestandardowej klasy lub collections.namedtuple:

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


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

Należy również zauważyć, że jeśli piszesz poza dosłowne można po prostu użyć argumentu słowa kluczowego:

>>> 'Hello {user.name}'.format(user=User('Markus')) 
'Hello Markus' 
Powiązane problemy