2

如果字典有一个整数键存储为字符串 {'0': 'foo'},您将如何在复合字段名称中使用.format()

我知道拥有这样的键的字典可能是非pythonic (和糟糕的编程) ......但在这种情况下,也不可能使用这种方式:

>>> a_dict = {0: 'int zero',
...           '0': 'string zero',
...           '0start': 'starts with zero'}
>>> a_dict
{0: 'int zero', '0': 'string zero', '0start': 'starts with zero'}
>>> a_dict[0]
'int zero'
>>> a_dict['0']
'string zero'
>>> " 0  is {0[0]}".format(a_dict)
' 0  is int zero'
>>> "'0' is {0['0']}".format(a_dict)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: "'0'"
>>> "'0start' is {0[0start]}".format(a_dict)
"'0start' is starts with zero"

{0[0]}.format(a_dict)int 0即使没有密钥,也将始终引用密钥,因此至少这是一致的:

>>> del a_dict[0]
>>> a_dict
{'0': 'string zero', '0start': 'starts with zero'}
>>> "{0[0]}".format(a_dict)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 0L

(是的,我知道'%s' % a_dict['0']如果需要我可以这样做。)

4

3 回答 3

3

str.format,不像例如"f-strings",不使用完整的解析器。要提取语法的相关位:

replacement_field ::=  "{" [field_name] ["!" conversion] [":" format_spec] "}"
field_name        ::=  arg_name ("." attribute_name | "[" element_index "]")*
element_index     ::=  digit+ | index_string
index_string      ::=  <any source character except "]"> +

field_name用方括号括起来的A是element_index,它可以是:

  1. 一个或多个数字(digit+,例如0- 但仅当它们都是数字时,这就是0start属于第二种情况的原因);或者
  2. “任何源字符,除了“]”的序列。

因此0['0']对于field_nameis "'0'"not '0'

...表单的表达式'[index]'使用 __getitem__().

因为"'0' is {0['0']}".format(a_dict)替换 is a_dict.__getitem__("'0'"),并且在语法中无法选择实际的a_dict['0'].

于 2021-02-11T20:56:22.713 回答
2

你不能。您需要向 format 传递一个附加参数。

>>> "'0' is {0[0]} {1}".format(a_dict, a_dict['0'])
于 2012-07-26T04:55:48.993 回答
0

编辑:我发现了问题。它正在调用dict。getitem带有字符串“'0'”,而不是预期的“0”。因此这是不可能的。对不起。

于 2012-07-26T05:01:42.610 回答