Подтвердить что ты не робот

Какова цель dictproxy?

__dict__ типа - это объект dictproxy, который только читается. Я хочу знать, в чем его цель. Это только для "не разрешать изменять встроенные типы"? Я нашел метод, который может обойти это. Я знаю, что не рекомендуется изменять встроенные типы. Но я пытаюсь изменить cdef class Cython на лету.

Я хочу знать, существует ли опасность изменить __dict__ of cdef class таким образом?

Вот код:

import gc
gc.get_referents(float.__dict__)[0]["square"] = lambda self: self*self
(3.14).square()
4b9b3361

Ответ 1

Цель dictproxy (найденная в классах) - разрешить оптимизацию в интерпретаторе Python и обеспечить его стабильность. Дополнительную информацию о требованиях к оптимизации см. В комментарии MartijnPieters ниже, которые, по-видимому, полагаются на ключи class.__dict__, всегда являющиеся строками.

dictproxy также, похоже, играет определенную роль в защите от определенных неустойчивостей в интерпретаторе. Для получения дополнительной информации об одной такой нестабильности см. Отчет об ошибке и исправление ошибок, обсуждаемое на python.org, с заголовком Обход __dict__ readonlyness. Если вы не используете какой-либо механизм прокси-сервера, тогда __dict__ можно записать в. Если его можно записать, его можно удалить. В отчете об ошибке они обсуждают некоторые сценарии, в которых можно удалить __dict__ и вызвать сбой интерпретатора.

Обратите внимание, что это контрастирует с экземплярами класса, которые вы можете назначать напрямую или с помощью __setitem__():

  • instance.__dict__['x'] = 1

Кроме того, экземпляр __dict__ может быть удален. Если он удален, он автоматически создается повторно при попытке назначения атрибута:

del instance.__dict__ instance.a = 1 instance.__dict__

Заключение

Таким образом, dictproxy позволяет классам работать более оптимально и делает интерпретатор более стабильным.

Ответ 2

__dict__ - это объект пространства имен, который содержит атрибуты классов.

Не должно быть проблем с изменением объекта dict, если вы не изменяете сам __dict__:

Пример:

//good
MyClass.x = 1 

//bad
MyClass.__dict__['x'] = 1

//good
m = MyClass()
m.x = 1

//also good
m.__dict__['x'] = 1

Документация Python [LINK]: Attribute assignment updates the module’s namespace dictionary, e.g., m.x = 1 is equivalent to m.__dict__["x"] = 1.

поэтому не должно возникнуть проблемы с модификацией объектов dict.

Далее

Поскольку мы можем модифицировать атрибуты класса, dict класса является всегда Writable:

__dict__ | The namespace supporting arbitrary function attributes. | Writable

Примечание

Это может быть Cpython имеет немного отличную реализацию, чем pyhton, но, как я могу прочитать из документации, о которой не упоминалось.