对象的Python格式字符串文本

对象的Python格式字符串文本,python,python-3.6,Python,Python 3.6,Python3.6的一个非常酷的新特性是实现格式化字符串文本() 不幸的是,它的行为与众所周知的format()函数不同: >> a="abcd" >> print(f"{a[:2]}") >> 'ab' 正如您所看到的,切片是可能的(实际上是字符串上的所有python函数)。 但是format()不适用于切片: >> print("{a[:2]}".format(a="abcd") Traceback (most recent call las

Python3.6的一个非常酷的新特性是实现格式化字符串文本()

不幸的是,它的行为与众所周知的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

str.format
语法不支持也不会支持较新的f字符串将支持的全部表达式。您必须在字符串之外手动计算切片表达式,并将其提供给format函数:

a = "abcd"
string_object = "{a}".format(a = a[:2])

还应注意的是,f-strings和
str.format
所允许的语法之间存在差异,因此前者严格来说不是后者的超集。

不,
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=“abcd”
>>>a[:'2']
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:切片索引必须是整数或无,或具有_索引_方法
它真的不适用于这种情况<代码>“{a[::]}”。我猜格式(a=a)也可能被评估为
a[:':']


这就是
f-strings
产生的原因之一,它是为了支持任何Python表达式的格式化愿望。

不。根据文档,它没有任何意义:据我所知,它是.format()的语法糖。从技术上讲,你可以使用
eval()
来实现它。一般来说,这不是一个好主意,但在这种情况下,由于格式字符串本身可以包含任意Python代码,因此要确保安全性就更加困难了。因此,即使您首先解析字符串(
ast.parse()
),并确保它只包含一个格式字符串,该格式字符串与
eval()
本身一样危险。
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