首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么格式化的字符串在{curly括号}中包含变量或操作之前不需要进行类型转换?

为什么格式化的字符串在{curly括号}中包含变量或操作之前不需要进行类型转换?
EN

Stack Overflow用户
提问于 2019-12-16 11:40:06
回答 2查看 78关注 0票数 1

如您所知,python是一种强类型语言,不允许int类型与str连接。

正如您在下面看到的;正如我前面所述,python不允许这样的操作(由于语言的特性,str与int的连接)。

代码语言:javascript
运行
复制
a = 10
b = '20'
print(a + b)
#throws the error **TypeError: unsupported operand type(s) for +: 'int' and 'str'**

但也要看看这个:

代码语言:javascript
运行
复制
a = 1
b = '2'
print(f"{a} and {b}")
print("{} and {}".format(a, b))#or this for example

在这里,我没有将变量a转换成字符串,它具有分配给;的int 类型,但是我可以将它包含在格式化的字符串中。

我的问题是..。当python解释器遇到这个表达式时,窗帘下会发生什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-16 12:01:11

当python解释器遇到这个表达式 print(f"{a} and {b}")时会发生什么?

在将ab内置到字符串中之前,会调用str(a)str(b)。当您构建这样的两个类时,您可以亲自看到这一点:

代码语言:javascript
运行
复制
class Test1(object):
    pass

class Test2(object):
    def __str__(self):
        return "surprise"

但是Test2在调用str(Test2())时返回"surprise"

当你想说服自己的时候,试试这个:

代码语言:javascript
运行
复制
t1 = Test1()
t2 = Test2()

print(t1)
print(t2)

print(f"{t1}")
print(f"{t2}")

print("{}".format(t1))
print("{}".format(t2))

每次打印相同的两行。

票数 2
EN

Stack Overflow用户

发布于 2019-12-16 12:57:29

这在Python文档的第2章中有记录。

如果指定了转换,则在格式化之前转换计算表达式的结果。转换'!s'对结果调用str()'!r'调用repr()'!a'调用ascii()

如果未指定转换,则立即继续执行以下步骤:

然后使用format()协议对结果进行格式化。格式说明符传递给表达式或转换结果的__format__()方法。当省略格式说明符时,将传递空字符串。然后,格式化的结果将包含在整个字符串的最终值中。

然后,__format__()方法遵循格式说明语语法来确定结果的字符串表示形式。

在您的示例中,结果与对变量调用str()相同,但这并不适用于所有变量。在@Marv的回答的基础上,这里有一个小小的演示来展示两者之间的区别:

代码语言:javascript
运行
复制
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
>>> test
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59355907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档