对于在Jinja和Flask中使用的MarkupSafe,添加str
对象和Markup
对象将返回Markup
对象:
>>> from flask import Markup
>>> 'foo' + Markup('bar')
Markup('foobar')
但是,如果我直接调用
str.__add__
,它将返回一个str
对象:>>> 'foo'.__add__(Markup('bar'))
'foobar'
因此,似乎将
str
和Markup
与+
相加会调用Markup.__add__
,而不管操作数的顺序如何。这怎么可能? 最佳答案
+
运算符调用Markup.__radd__
而不是str.__add__
,因为右操作数的类型(Markup
)是左操作数的类型(str
)的子类。
(请参见Difference between a+b and a.__add__(b))
在str.__add__
对象上调用Markup
时,Markup
对象仅被视为str
对象,并且仅在考虑str
类型的情况下完成该操作。
关于python - 为什么str + Markup返回一个Markup对象?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58548570/