Комментарии 10
Как так вышло?
>>> Color('black')
<Color.PURPLE: ColorInfo(value='purple', rgb=RGB(red=128, green=0, blue=128), ru='пурпурный')>
Код на картинке-заставке простой и понятный. Итоговый код заставит напрячься мозг надолго. Чего ради?
это как открытие новых горизонтов в мире перечислений. Этот отзыв, словно секретный ключ, предоставляет инсайты и техники для улучшения и расширения функционала Enum в языках программирования. Исследование новых подходов к использованию Enum может привести к более гибким и мощным решениям в коде. Увлекательное путешествие в обогащение стандартных инструментов программирования!"
в моей практике часто баловался с перечислениями в питоне: и наследовал, и записывал им в 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__
@ilichev-andrey Ответь плиз
Кажется в середине 2021, когда мне впервые понадобилась такая функциональность, я наткнулся на этот ответ или это обсуждение. На тот момент такой вариант меня вполне устраивал поэтому дальше и не разбирался.
Как расширить возможности стандартного Enum