在字符串格式化中使用负索引或切片时,为什么会出现“TypeError:字符串索引必须是整数”?

问题描述 投票:0回答:1

我想了解为什么这个效果很好:

>>> 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()
。这些变量超出了我的控制范围。我提前知道变量的名称和类型,只能传递格式化字符串。格式化字符串是我唯一的输入。当我需要组合一些字符串或操作数字及其精度时,一切都很好。但当我需要提取子字符串时,一切都崩溃了。

python formatting
1个回答
0
投票

为什么不起作用

这在

str.format()
的规格中进行了解释:

arg_name 后面可以跟任意数量的索引或属性表达式。 “.name”形式的表达式使用

getattr()
选择命名属性,而“[index]”形式的表达式使用
__getitem__()
进行索引查找。

也就是说,您可以使用括号表示法对字符串进行索引,并且您放在括号内的索引将是字符串的

__getitem__()
方法的参数。 这是索引,而不是切片。最重要的是,
str.format()
根本不支持替换字段的切片(=
{}
之间的部分),因为此功能不是规范的一部分。

问题的解决方案

使用f弦

>>> 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'
© www.soinside.com 2019 - 2024. All rights reserved.