2011-10-28 8 views
7

Powiedz, że mam słownik z kropkami w nazwach pól, np. {'person.name': 'Joe'}. Jeśli chciałem użyć tego w str.format, czy to możliwe?python: kropki w nazwie zmiennej w ciągu formatu

Moim pierwszym odruchem było

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

ale to będzie działać tylko wtedy, gdy mój DICT zostały kształcie

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

The relevant manual docs section nie wspomina zresztą o ucieczce do kropki.

(Sidenote: Myślałem, że generalnie

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

spowodowałoby błąd, ale ** -expanded wywołanie funkcji wydaje się działać, nawet jeśli są one nie ważnych identyfikatorów To robi error out! . na nie-strun choć o_O)

+0

Czy próbowałeś uciec kropki z ukośnikiem odwrotnym? –

+0

@RafeKettler: Tak. To nie działa, ponieważ uciekasz przed ciągiem, a nie specyfikatorem formatu. – nfirvine

+0

Możliwy duplikat [Jak używać kropki w ciągach w formacie Python?] (Http://stackoverflow.com/questions/29035168/how-to-use-a-dot-in-python-format-strings) –

Odpowiedz

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

Zamknij, ale to działałoby tylko wtedy, gdy przekazujesz słownik z jednym kluczem, po jednym dla każdego zastąpienia pozycyjnego. Na przykład nie powiedzie się: ''Imię: {0 [person.name]} Wiek: {1 [person.age]}'. Format ({'person.name': 'Joe', 'person.age': 42 }) ' – jathanism

+2

Ale możesz powtórzyć 0 tyle razy, ile potrzeba. Działa to dobrze: ''Name: {0 [person.name]} Age: {0 [person.age]}'. Format ({'person.name': 'Joe', 'person.age': 42}) ' –

+0

Niesamowite, nie wiedziałem, że możesz to zrobić i nauczyłem się czegoś. Dzięki! :) – jathanism

3

Jednym ze sposobów obejścia tego problemu jest użycie starego % formatowanie (które nie zostały jeszcze wycofane):

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

miałem podobny problem i rozwiązać go przez dziedziczenie z 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) 

jednak nie można używać str.format() ponieważ wciąż wskazując na starym formater i trzeba iść tak

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