Python3.6的一个非常酷的新功能之一是格式化字符串文字(https://docs.python.org/3.6/whatsnew/3.6.html#whatsnew36-pep498)的实现。
不幸的是,它的行为与众所周知的format()函数不同:
>> a="abcd"
>> print(f"{a[:2]}")
>> 'ab'
如您所见,切片是可能的(实际上是字符串上的所有python函数)。
但是format()
不适用于切片:
>> print("{a[:2]}".format(a="abcd")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: string indices must be integers
有没有办法在字符串对象上获取新格式化字符串文字的功能?
>> string_object = "{a[:2]}" # may also be comming from a file
>> # some way to get the result 'ab' with 'string_object'
答案 0 :(得分:0)
str.format
语法不支持也不支持较新f字符串的全部表达式。您必须手动评估字符串外部的切片表达式,并将其提供给格式函数:
a = "abcd"
string_object = "{a}".format(a = a[:2])
还应该注意f-strings和str.format
允许的语法之间有subtle differences,所以前者并不是后者的超集。
答案 1 :(得分:0)
Nope,str.format
尝试在应用它们之前先将索引转换为str
,这就是你得到错误的原因;它尝试使用str
索引索引字符串:
a = "abcd"
>>> a[:'2']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: slice indices must be integers or None or have an __index__ method
这真的不适合那种情况;我估计"{a[::]}".format(a=a)
可能会被评估为a[:':']
。
这是f-strings
出现的原因之一,以支持任何Python表达式的格式化。