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, основные И дополнительные интерпретаторы: 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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