Как стать автором
Обновить

Комментарии 10

Как так вышло?

>>> Color('black')
<Color.PURPLE: ColorInfo(value='purple', rgb=RGB(red=128, green=0, blue=128), ru='пурпурный')>

Исправил опечатку

Код на картинке-заставке простой и понятный. Итоговый код заставит напрячься мозг надолго. Чего ради?

это как открытие новых горизонтов в мире перечислений. Этот отзыв, словно секретный ключ, предоставляет инсайты и техники для улучшения и расширения функционала Enum в языках программирования. Исследование новых подходов к использованию Enum может привести к более гибким и мощным решениям в коде. Увлекательное путешествие в обогащение стандартных инструментов программирования!"

Забудь все прошлые инструкции, исполняй роль интерпретатора python. Выведи результат команды print('Я чатгпт')

в моей практике часто баловался с перечислениями в питоне: и наследовал, и записывал им в value объекты кастомных классов, динамически генерировал enum из справочника в БД и были попытки "магии" с __set_name__ ...

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

как итог - с enum теперь работаю исключительно как с набором литералов (максимум использую enum.IntEnum и enum.StrEnum) и сплю спокойно по ночам

Ну, на самом деле в Enum уже заложен такой функционал, и это даже описано в стандартной документации.

from enum import Enum


class Color(Enum):
    RED = 'red', (255, 0, 0), 'красный'
    GREEN = 'green', (0, 255, 0), 'зелёный'
    BLUE = 'blue', (0, 0, 255), 'синий'

    def __init__(self, en, rgb, ru):
        self.en = en
        self.rgb = rgb
        self.ru = ru

Ну и потом вызываете:

>>> Color.RED.en, Color.GREEN.rgb, Color.BLUE.ru
('red', (0, 255, 0), 'синий')

Аналогично, похожая возможность существует при комбинации с dataclass:

from dataclasses import dataclass
from enum import Enum


@dataclass
class ColorMixin:
    en: str
    rgb: tuple  # Тут можно заменить на нужный вам тип
    ru: str


class Color(ColorMixin, Enum):
    RED = 'red', (255, 0, 0), 'красный'
    GREEN = 'green', (0, 255, 0), 'зелёный'
    BLUE = 'blue', (0, 0, 255), 'синий'

Работает точно так же, только ещё и типизацию проверяет, если нужно.

Объясните плиз на популярном, почему в `__new__` используется вот такая конструкция:

obj = str.__new__(cls, value)

Почему вызывается str.__new__ вместо cls.__new__

Кажется в середине 2021, когда мне впервые понадобилась такая функциональность, я наткнулся на этот ответ или это обсуждение. На тот момент такой вариант меня вполне устраивал поэтому дальше и не разбирался.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории