我想了解为什么这个方法有效:
>>> test_string = 'long brown fox jump over a lazy python'
>>> 'formatted "{test_string[0]}"'.format(test_string=test_string)
'formatted "l"'
但这失败了:
>>> 'formatted "{test_string[-1]}"'.format(test_string=test_string)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: string indices must be integers
>>> 'formatted "{test_string[11:14]}"'.format(test_string=test_string)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: string indices must be integers
我知道这可以用于:
'formatted "{test_string}"'.format(test_string=test_string[11:14])
...但就我的情况来说这是不可能的。
我正在处理一个类似沙盒的环境,其中将变量列表作为 kwargs 字典传递str.format()
。这些变量不在我的控制范围内。我事先知道变量的名称和类型,只能传递格式化字符串。格式化字符串是我唯一的输入。当我需要组合几个字符串或操作数字及其精度时,一切都很好。但是当我需要提取子字符串时,一切都崩溃了。
为什么它不起作用
规范
str.format()
中对此进行了解释:也就是说,您可以使用括号表示法对字符串进行索引,并且括号内的索引将成为
__getitem__()
字符串方法的参数。这是索引,而不是切片。底线是str.format()
根本不支持对替换字段(= 之间的部分{}
)进行切片,因为此功能不是规范的一部分。关于负索引,语法规定:
这意味着索引可以是数字序列(
digit+
)或字符串。由于任何负索引(例如 )-1
都不是数字序列,因此它将被解析为index_string
。但是str.__getitem__()
仅支持整型参数。因此出现错误TypeError: string indices must be integers, not 'str'
。问题的解决方案
使用 f 字符串
使用
str.format()
但直接切片的参数str.format()
,而不是替换字段该
str.format()
方法使用与f 字符串文字不同的语法。使用 f 字符串,它可以按预期工作:
另外,比较一下使用字典索引时的语法: