对于在Jinja和Flask中使用的MarkupSafe,添加str对象和Markup对象将返回Markup对象:

>>> from flask import Markup
>>> 'foo' + Markup('bar')
Markup('foobar')


但是,如果我直接调用str.__add__,它将返回一个str对象:

>>> 'foo'.__add__(Markup('bar'))
'foobar'


因此,似乎将strMarkup+相加会调用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/

10-12 23:16