Аннотации типов для атрибута Enum

У меня есть этот фрагмент кода:

import enum


class Color(enum.Enum):
    RED = '1'
    BLUE = '2'
    GREEN = '3'


def get_color_return_something(some_color):
    pass

Как мне правильно добавить аннотации типов к переменной some_color в этой функции, если я предполагаю, что получу атрибут enum из перечисления Color (например: Color.RED)?


person Yuval Pruss    schedule 03.10.2018    source источник
comment
Color.RED.value?   -  person GraphicalDot    schedule 03.10.2018
comment
Да, some_color должен иметь значение из Color Enum @GraphicalDot   -  person Yuval Pruss    schedule 03.10.2018
comment
Я предлагаю отредактировать, поскольку вопрос действительно касается атрибутов перечисления, а не значений.   -  person Garrett    schedule 20.05.2021


Ответы (2)


Подсказка типа Color class должна работать:

def get_color_return_something(some_color: Color):
    print(some_color.value)
person ibarrond    schedule 03.10.2018
comment
Если я передаю Color.RED этой функции, я получаю предупреждение Ожидаемый тип «Цвет», вместо этого я получил «str». - person Gazzini; 26.08.2019
comment
Я не могу воспроизвести это предупреждение. В моей консоли Python я получаю >>> get_color_return_something(Color.RED) 1. Предупреждений пока нет. - person ibarrond; 01.09.2019
comment
@Gazzini Этот плагин может помочь с предупреждением. pypi.org/project/pylint-enums - person wsysuper; 26.10.2019
comment
Если вы используете этот синтаксис для подсказки типов, для ясности / читаемости вашего кода, вероятно, будет хорошо иметь эти классы перечисления в отдельном модуле / папке, называемой типами или чем-то подобным. - person Alex W; 09.03.2020

Следующее будет работать с Pyton 3.9 / PyCharm

from enum import Enum
from typing import Optional, Union


class Color(Enum):
    RED: int = 1
    GREEN: int = 2


def guess_color(x: Union[Color.RED, Color.GREEN]) -> Optional[ValueError]:
    if x == Color.RED:
        print("Gotcha!")
    else:
        return ValueError(f"It's not {Color.RED}")


guess_color(Color.RED)
person Paul Weemaes    schedule 11.10.2020
comment
Зачем возвращать ValueError вместо того, чтобы поднять его? Кроме того, эта функция не сможет выполнить проверку mypy. См. Эту суть на mypy Playground. - person Georgy; 11.10.2020
comment
@Georgy: Я особо не задумывался о том, чтобы вернуть ValueError, но это не имеет отношения к тому, что я пытаюсь показать. Замените строку оператором печати, если хотите. Кроме того, у меня нет опыта работы с mypy, поэтому я не могу вам с этим помочь, извините. Я прямо заявил, что он работает с Python 3.0 / PyCharm, я не претендую ни на что большее. - person Paul Weemaes; 12.10.2020
comment
Вы можете использовать Literal[Color.RED] от ввода, чтобы это работало правильно. Я пытался предложить правку, но похоже, что очередь заполнена. (вам также нужно будет вернуть None в условии if) - person ryan28561; 29.10.2020
comment
Этот ответ помог мне, потому что он показывает, что я могу вводить атрибуты класса, аналогичные dataclass. - person Stefan_EOX; 23.04.2021
comment
Это действительно противоречит цели перечисления - person Gulzar; 08.07.2021