我在使用str.format()方法时遇到了一点奇怪,并想知道是否有解决方法。
以下是我面临的问题的基本示例:
'something {first.alpha} something {last}'.format(**{'first.alpha':'then', 'last':'else'})
我希望这会回来:
"something then something else"
但我得到了这个错误:
KeyError: 'first'
我知道还有其他格式化字符串的方法,但到目前为止,这种方法似乎非常适合我所需要的。
以下示例运行正常,但重要的是“first.alpha”键存在。
'something {first} something {last}'.format(**{'first':'then', 'last':'else'})
有没有办法让我仍然能够使用str.format()方法并在密钥中包含fullstops?
答案 0 :(得分:4)
在format
中使用命名参数的方式将是这样的
>>> 'something {first_alpha} something {last}'.format(first_alpha = 'then', last = 'else')
'something then something else'
我不会使用first.alpha
因为它认为first
有一个属性alpha
。
答案 1 :(得分:4)
您不能在占位符名称中使用.
。相反,.
是表示属性查找的语法的一部分。格式严格限制有效Python标识符的键,这意味着它们必须在开头至少有一个字母或下划线。
来自Format String Syntax documentation的语法:
replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"
field_name ::= arg_name ("." attribute_name | "[" element_index "]")*
arg_name ::= [identifier | integer]
attribute_name ::= identifier
因此field_name
是整数或valid Python identifier,使用.
表示将之后的所有内容都解释为属性。
您无法使用**{...}
语法解决此问题;坚持使用有效的Python标识符。