我想了解为什么这个效果很好:
>>> 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()
的规格中进行了解释:
arg_name 后面可以跟任意数量的索引或属性表达式。 “.name”形式的表达式使用
选择命名属性,而“[index]”形式的表达式使用getattr()
进行索引查找。__getitem__()
也就是说,您可以使用括号表示法对字符串进行索引,并且您放在括号内的索引将是字符串的
__getitem__()
方法的参数。 这是索引,而不是切片。最重要的是,str.format()
根本不支持替换字段的切片(={}
之间的部分),因为此功能不是规范的一部分。
>>> test_string = 'long brown fox jump over a lazy python'
>>> f"formatted {test_string[0]}"
'formatted l'
>>> f"formatted {test_string[0:2]}"
'formatted lo'
>>> f"formatted {test_string[-1]}"
'formatted n'
str.format()
但直接对 str.format()
的参数进行切片,而不是替换字段:>>> test_string = 'long brown fox jump over a lazy python'
>>> 'formatted {replacement}'.format(replacement=test_string[0:2])
'formatted lo'
>>> 'formatted {replacement}'.format(replacement=test_string[-1])
'formatted n'