Подсказка типа Python enum staticmethod, где определены литеральные типыPython

Программы на Python
Anonymous
Подсказка типа Python enum staticmethod, где определены литеральные типы

Сообщение Anonymous »

В приведенном ниже коде атрибуту направления класса данных Horizontal присвоен тип, позволяющий разрешать только 3 из 5 значений из перечисления Direction. Я хочу иметь возможность возвращать значение перечисления из динамического ввода, используя статический метод from_string, который возвращается к Direction.UNKNOWN, если строка не соответствует ни одному из значений перечисления. На практике код работает, но mypy жалуется на следующую ошибку:

27: ошибка: несовместимые типы при присвоении (выражение имеет тип «Направление» , переменная имеет тип "Литеральный[Направление.ЛЕВО, Направление.ПРАВО, Направление.НЕИЗВЕСТНО]") [назначение]
Обнаружена 1 ошибка в 1 файле (проверен 1 исходный файл)

Это понятно, поскольку мы получаем общий экземпляр Direction из статического метода, а не один из трех конкретных, для которых указан тип. Есть ли какие-либо способы обойти это, которые удовлетворили бы mypy, кроме удаления типа возвращаемого значения метода from_string?
from dataclasses import dataclass
from enum import auto, StrEnum
from typing import Literal

class Direction(StrEnum):
DOWN = auto()
LEFT = auto()
RIGHT = auto()
UP = auto()
UNKNOWN = auto()

@staticmethod
def from_string(value: str) -> 'Direction':
try:
return Direction(value.lower())
except ValueError:
pass
return Direction.UNKNOWN

@dataclass
class Horizontal:
direction: Literal[Direction.LEFT, Direction.RIGHT, Direction.UNKNOWN] = Direction.UNKNOWN

horizontal = Horizontal()
horizontal.direction = Direction.LEFT
print(f'{horizontal=}')
horizontal.direction = Direction.from_string(input('Enter a direction: '))
print(f'{horizontal=}')


Подробнее здесь: https://stackoverflow.com/questions/771 ... re-defined

Вернуться в «Python»