【问题标题】:Can I use a dict. with a function "format"? [duplicate]我可以使用字典吗?具有“格式”功能? [复制]
【发布时间】:2016-08-04 21:59:40
【问题描述】:

如果我有这个:

>>> templ = "{aa} fd3443fds {bb} 543gfdgf {cc}"
>>> d1 = {"aa": "this is aa", "bb": "this is bb33", "cc": "this is cc5222"}

用“d1”中的相应值替换templ中{}中的值最简单的方法是什么,最好使用String的“format”函数?

【问题讨论】:

  • Joota,你的意思是String 还是str?我不知道String 是什么。

标签: python python-3.x


【解决方案1】:

如果你有一个模板字符串templ和一个字典d1,你可以这样填写模板变量:

result = templ.format(**d1)

如果您有一个对象d1 具有d1.aa、d1.bb 等属性:

class Class1: pass
d1 = Class1()
d1.aa = d1.bb = d1.cc = 'hello'

然后你可以重写你的模板字符串:

templ = "{0.aa} fd3443fds {0.bb} 543gfdgf {0.cc}"
result = templ.format(d1)

或者你可以使用vars(d1):

templ = "{aa} fd3443fds {bb} 543gfdgf {cc}"
result = templ.format(**vars(d1))

【讨论】:

  • 如何为实例的属性做到这一点?换句话说,如果 d1 是某个 Class1 的一个实例,并且它具有属性“aa”、“bb”和“cc”。按原样传递它会引发异常。
  • @Joota - 尝试使用.format(**vars(d1))。查看我最近的编辑。
  • 仅供参考,在现代 Python 中,result = templ.format(**d1) 可以使用str.format_map 来支持任意非dict 对象,只要它们通过result = templ.format_map(d1) 支持映射协议即可。在某一时刻,这对于 dict 子类也是必要的,但看起来至少在 3.5 中并非如此('{a},{b}',format(**defaultdict(lambda: 'foo')) 产生 'foo,foo' 而不是错误输出,表明 defaultdict 状态没有丢失) .
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-12
  • 2013-03-26
  • 1970-01-01
  • 1970-01-01
  • 2013-06-07
  • 1970-01-01
  • 2011-08-26
相关资源
最近更新 更多