Общее сопоставление Python с ограничениями типаPython

Программы на Python
Anonymous
Общее сопоставление Python с ограничениями типа

Сообщение Anonymous »

Я пытаюсь смоделировать простую систему обработки сообщений на Python. Идея состоит в том, чтобы зарегистрировать функции, которые действуют как обработчики сообщений, в зависимости от типа сообщения. Примерно так:

Код: Выделить всё

class Message(Protocol):
...

class M1(Message):
...

def handler1(message: M1) -> None:
return None

handler_container: dict[type[Message], Callable[..., None]] = {M1: handler1}

def handle_message(message: Message) -> None:
handler = handler_container[type(message)]
return handler(message)
В этом вся суть. Я сталкиваюсь с проблемами ввода, когда хочу ввести разные типы возвращаемых данных для каждого обработчика и ограничить их типом сообщения. Представьте себе:

Код: Выделить всё

def handle_message(message: Message[T]) -> T:
...
Я хочу убедиться, что при вызове handle_message я получаю обратно указанный тип возвращаемого значения. Вот так:

Код: Выделить всё

class M2(Message[int]):
...

def m2_handler(message: M2) -> int:
...

# or

class M3(Message[None]):
...

def m3_handler(message: M3) -> None:
...
Я дошёл до того, что зарегистрировал всё это примерно так:

Код: Выделить всё

handler_container: dict[type[Message[Any]], Callable[..., Any]
а затем мне пришлось набирать.Cast при возврате из handle_message, но есть и другие проблемы, например, когда я проверяю.signature обработчик, тип, возвращаемый для сообщения, не проходит проверку issubclass, я получаю issubclass() arg 1 должен быть классом (аргументом является Message[NoneType]).
Есть идеи, как я могу добиться такой безопасности? Я понимаю, что полностью статически напечатать это может оказаться невозможным, поэтому при необходимости я буду в порядке с кастингом. Открыт для любых идей, спасибо!

Подробнее здесь: https://stackoverflow.com/questions/760 ... onstraints

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