Почему str + Markup возвращает объект Markup? - PullRequest
1 голос
/ 24 октября 2019

С MarkupSafe , который используется в Jinja и Flask, при добавлении объекта str и объекта Markup возвращается объект Markup:

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

Но еслиЯ вызываю str.__add__ напрямую, он возвращает str объект:

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

Так что кажется, что добавление str и Markup с + вызывает Markup.__add__ независимо от порядкаоперанды. Как это возможно?

1 Ответ

3 голосов
/ 24 октября 2019

Оператор + вызывает Markup.__radd__ вместо str.__add__, поскольку тип правого операнда (Markup) является подклассом типа левого операнда (str).

(см. Разница между a + b и .__ add __ (b) )

При вызове str.__add__ для объекта Markup объект Markup выглядит как объект strи операция выполняется с учетом только типа str.

...