如果字典的整数键存储为字符串 {'0': 'foo'}
,您如何使用.format()
在Compound Field Names中引用该字符?
我认为它可能是非pythonic (以及糟糕的编程)来获得带有这些键的dict ......但在这种情况下,它也不可能以这种方式使用:
>>> 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']
。)
答案 0 :(得分:3)
你做不到。您需要传入一个额外的参数来格式化。
>>> "'0' is {0[0]} {1}".format(a_dict, a_dict['0'])
答案 1 :(得分:3)
str.format
,不像例如"f-strings",不使用完整的解析器。提取 grammar 的相关位:
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
是一个 element_index
,它是:
digit+
,例如 0
- 但前提是它们是all 数字,这就是为什么 0start
属于第二种情况);或因此对于 0['0']
,field_name
是 "'0'"
,不是 '0'
。
... 形式为 '[index]'
的表达式使用
__getitem__()
。
对于 "'0' is {0['0']}".format(a_dict)
,替换为 a_dict.__getitem__("'0'")
,语法中无法选择实际的 a_dict['0']
。
答案 2 :(得分:1)
编辑:我发现了问题。它使用字符串“'0'”调用dict。 getitem ,而不是按预期调用“0”。因此这是不可能的。遗憾。