Enum Композиция в Python - PullRequest
       1

Enum Композиция в Python

0 голосов
/ 04 января 2019

Мне было трудно найти примеры композиции OO Enum в Python. Итак, я хотел бы спросить, является ли следующий пример правильным или более питонскими способами рекомендуется?

Я предпочитаю синтаксис класса в объявлении Enum, но, похоже, для композиции рекомендуется функционал API. Любой способ сделать это с помощью синтаксиса класса?

from enum import Enum


class Vertical(Enum):

    Tall = 1
    Short = 2


class Horizontal(Enum):

    Slim = 1
    Spacious = 2


composition = list(Vertical.__members__)
composition.extend(Horizontal.__members__)

Body = Enum('Body', composition)

1 Ответ

0 голосов
/ 05 января 2019

Вы не можете получить перечисления, они "запечатаны":

class Body(Vertical): pass

приводит к TypeError: Cannot extend enumerations.


Если вы хотите, чтобы ваши составные перечисления сравнивались равными, вы можете использовать IntEnum s:

from enum import IntEnum 

class Vertical(IntEnum ):
    Tall = 1
    Short = 2 

class Horizontal(IntEnum):  # distinct int's
    Slim = 3
    Spacious = 4 

composition = list(Vertical.__members__)
composition.extend(Horizontal.__members__)

Body = IntEnum('Body', composition)

Использование:

print(Body.Tall == Vertical.Tall)  # True
print(Body.Tall == 1)              # Also True

По сути, все сводится к следующему: ваши перечисления теперь тоже целые. Вы должны позаботиться о том, чтобы не давать одно и то же целое число различным понятиям:

class Sizes(IntEnum):
    Tiny = 1

print(Sizes.Tiny == Vertical.Tall)  # True - but not really?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...