如您所知,python是一种强类型语言,不允许int类型与str连接。
正如您在下面看到的;正如我前面所述,python不允许这样的操作(由于语言的特性,str与int的连接)。
a = 10
b = '20'
print(a + b)
#throws the error **TypeError: unsupported operand type(s) for +: 'int' and 'str'**但也要看看这个:
a = 1
b = '2'
print(f"{a} and {b}")
print("{} and {}".format(a, b))#or this for example在这里,我没有将变量a转换成字符串,它具有分配给;的int 类型,但是我可以将它包含在格式化的字符串中。
我的问题是..。当python解释器遇到这个表达式时,窗帘下会发生什么?
发布于 2019-12-16 12:01:11
当python解释器遇到这个表达式
print(f"{a} and {b}")时会发生什么?
在将a和b内置到字符串中之前,会调用str(a)和str(b)。当您构建这样的两个类时,您可以亲自看到这一点:
class Test1(object):
pass
class Test2(object):
def __str__(self):
return "surprise"但是Test2在调用str(Test2())时返回"surprise"。
当你想说服自己的时候,试试这个:
t1 = Test1()
t2 = Test2()
print(t1)
print(t2)
print(f"{t1}")
print(f"{t2}")
print("{}".format(t1))
print("{}".format(t2))每次打印相同的两行。
发布于 2019-12-16 12:57:29
这在Python文档的第2章中有记录。
如果指定了转换,则在格式化之前转换计算表达式的结果。转换
'!s'对结果调用str(),'!r'调用repr(),'!a'调用ascii()。
如果未指定转换,则立即继续执行以下步骤:
然后使用
format()协议对结果进行格式化。格式说明符传递给表达式或转换结果的__format__()方法。当省略格式说明符时,将传递空字符串。然后,格式化的结果将包含在整个字符串的最终值中。
然后,__format__()方法遵循格式说明语语法来确定结果的字符串表示形式。
在您的示例中,结果与对变量调用str()相同,但这并不适用于所有变量。在@Marv的回答的基础上,这里有一个小小的演示来展示两者之间的区别:
class Test:
def __str__(self):
return "surprise"
def __format__(self, format_spec):
return "test"
t1 = Test()
print(t1)
print(str(t1))
print(f"{t1}")
print("{}".format(t1))
>>> surprise
>>> surprise
>>> test
>>> testhttps://stackoverflow.com/questions/59355907
复制相似问题