python:格式字符串中变量名称中的点

nfi*_*ine 10 python string-formatting

假设我有一个字段名称带字符的字典,比如{'person.name': 'Joe'}.如果我想用它str.format,有可能吗?

我的第一直觉是

'Name: {person.name}'.format(**{'person.name': 'Joe'})
Run Code Online (Sandbox Code Playgroud)

但这只有在我的字形被塑造的情况下才有效

{'person':{'name':Joe}}
Run Code Online (Sandbox Code Playgroud)

相关的手册文档部分没有提到逃避点.

(旁注:我一般认为

def func(**kw): print(kw)
func(**{'a.b': 'Joe'})
Run Code Online (Sandbox Code Playgroud)

会导致错误,但**即使它们不是有效的标识符,-expanded函数调用似乎也能正常工作!但它确实在非字符串上出错.O_O)

Mic*_*man 7

'Name: {0[person.name]}'.format({'person.name': 'Joe'})
Run Code Online (Sandbox Code Playgroud)

  • 但是你可以根据需要重复0次.这很好用:''姓名:{0 [person.name]}年龄:{0 [person.age]}'.format({'person.name':'Joe','person.age':42}) ` (3认同)

Ski*_*Ski 7

我有类似的问题,我通过继承解决了它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)
Run Code Online (Sandbox Code Playgroud)

但是你不能使用,str.format()因为它仍然指向旧的格式化程序,你需要像这样

>>> MyFormatter().vformat("{a.b}", [], {'a.b': 'Success!'})
'Success!'
Run Code Online (Sandbox Code Playgroud)


Sve*_*ach 5

解决此问题的一种方法是使用旧%格式(尚未弃用):

>>> print 'Name: %(person.name)s' % {'person.name': 'Joe'}
Name: Joe
Run Code Online (Sandbox Code Playgroud)