Рецепт поваренной книги Python9.14 Обсуждение

Когда я прочитал обсуждение рецепта 9.14 Python Cookbook, в нем говорится, что я должен преобразовать OrderedDict в экземпляр dict при создании конечного объекта класса. Должен ли я это делать или можно использовать OrderedDict?

Я пробовал это, передал OrderedDict в конструктор типа, он не вызывает никаких исключений.

class OrderedMeta(type):
    def __new__(cls, clsname, bases, attr_dict):
        order = []
        for name, value in attr_dict.items():
            if isinstance(value, Typed):
                value._name = name
                order.append(name)
        attr_dict['_order'] = order
        return type.__new__(cls, clsname, bases, attr_dict)

    @classmethod
    def __prepare__(cls, clsname, bases):
        return OrderedDict()

код из книги

class OrderedMeta(type):
    def __new__(cls, clsname, bases, attr_dict):
        d = dict(attr_dict)
        order = []
        for name, value in attr_dict.items():
            if isinstance(value, Typed):
                value._name = name
                order.append(name)
        d['_order'] = order
        return type.__new__(cls, clsname, bases, d)

    @classmethod
    def __prepare__(cls, clsname, bases):
        return OrderedDict()

введите описание изображения здесь

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы должны сделать это по некоторым причинам, которые Дэвид Бизли не уточнил дальше, чем сказал, что

"it may cause problems if you don't"

в его Учебник 2013 г. Python 3 Metaprogramming, около 1 часа 30 минут.

Поскольку в этом руководстве в Python 3.6 появились словари, которые сохраняют свой порядок, вы, вероятно, можете смело игнорировать использование ordereddict для этого рецепта.

спасибо, что касается того, как я смотрю видео, он не доказал, что неправильное использование словаря приведет к сбою программы или любому сообщению об ошибке, точное время 1:35:25, еще раз, спасибо за ответ на мой вопрос

Zachary Chan 31.05.2019 10:24

Добро пожаловать, я рад, что смог помочь; действительно, Дэвид Бизли не уточняет причины. Если вы считаете, что мой ответ помог вам, вы можете рассмотреть что делать, когда кто-то отвечает на мой вопрос и как принять мой ответ

Reblochon Masque 31.05.2019 10:42
Ответ принят как подходящий

Нет, это не нужно.

type.__new__ может принимать любое сопоставление - возможно, даже с меньшим количеством методов, чем протокол полного сопоставления - __iter__, __len__ и __getitem__ должно быть достаточно.

Это, вероятно, верно, начиная с Python 3.0 - автор рецепта просто выбрал «безопасную дорогу», поскольку он не был уверен, что может произойти, если неродной dict будет передан в type.__new__, а вызов dict в OrderedDict — это простая строка кода. в любом случае.

Но не имело бы особого смысла разрешать использование любого пользовательского сопоставления в __prepare__, а затем не принимать это же сопоставление в type.__new__. То есть вам даже не нужен метод __new__ в вашем метаклассе, если все, что вам нужно, это пользовательское сопоставление - просто метод __prepare__.

Тем не менее, этот конкретный рецепт сейчас в любом случае устарел, поскольку словари Python 3.6, используемые при построении классов, упорядочены по умолчанию (а начиная с Python 3.7 все словари Python упорядочены по умолчанию).

спасибо, вы очень ясно выразились, не могли бы вы взглянуть на еще один мой вопрос?связь

Zachary Chan 31.05.2019 16:31

Другие вопросы по теме