python: точки в имени переменной в строке формата

скажем, у меня есть словарь с точками в названии полей, например {'person.name': 'Joe'}. Если бы я хотел использовать это в str.format, это возможно?

моим первым побуждением было

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

но это будет работать только в том случае, если мой дикт будет иметь форму

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

соответствующий раздел руководства docs в любом случае не упоминает о побеге от точки.

(Sidenote: я думал, что вообще

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

вызовет ошибку, но **-расширенный вызов функции, похоже, работает, даже если они не допустимыми идентификаторами! Это тут ошибка на не-строках, хотя. О_о)

3 ответов


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

один из способов обойти это, чтобы использовать старый % форматирование (которое еще не устарело):

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

у меня была аналогичная проблема, и я решил ее, унаследовав от 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!'