Str() подкласса dict не возвращает "{}" для MROPython

Программы на Python
Anonymous
Str() подкласса dict не возвращает "{}" для MRO

Сообщение Anonymous »

Если класс наследует от dict, почему str() не использует dict.__str__, если dict находится раньше в MRO класса?

Код: Выделить всё

Python 3.10.12 (main, Sep 11 2024, 15:47:36) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> class A:
...  def __str__(self):
...   return "A"
...
>>> class B(dict, A):
...  pass
...
>>> B.__mro__
(, , , )
>>> str(B())
'A'
>>> str(dict())
'{}'
>>>
При вызове str(B()) почему dict.__str__ не вызывается вместо A.__str__ ?
Это как-то связано с тем, что у dict вместо функции slot_wrapper?

Код: Выделить всё

>>> dict.__str__

>>> A.__str__

>>> B.__str__

РЕДАКТИРОВАНИЕ в отношении субинтерпретаторов
В субинтерпретаторе Python 3.12 поведение отличается.
С этого началось мое расследование. Приложение Django, работающее в Apache с mod_wsgi, выявило разницу.
Проверка dict.__str__:
Python 3.10.12, основной AND субпереводчики: Python 3.12.3, основной интерпретатор: Python 3.12.3, дополнительный интерпретатор: Этот добавленный dict.__str__ заставляет формы Django отображать ошибки как «{}» или «[]» , вместо "".
Исправление заключалось в добавлении этой строки в определение сайта Apache:

Код: Выделить всё

WSGIApplicationGroup %{GLOBAL}
что, согласно документации modwsgi:

Код: Выделить всё

>> ... forces the WSGI application to run in the main Python interpreter...
В конфигурации уже использовались директивы:

Код: Выделить всё

WSGIDaemonProcess
WSGIProcessGroup WSGIScriptAlias
EDIT
Это ошибка в Python 3.12.4 и более ранних версиях. См. gh-117482

Подробнее здесь: https://stackoverflow.com/questions/790 ... er-the-mro

Вернуться в «Python»