格式化字符串时出现问题 - Python 2.7.3

时间:2015-06-02 17:33:42

标签: python python-2.7

我在使用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?

2 个答案:

答案 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标识符。