Установить тип переменной, чтобы она совпадала с содержимым набора

#python-3.x #string #set #python-typing

#python-3.x #строка #установить #python-типизация

Вопрос:

Я хочу иметь возможность с помощью модуля ввода python и средства проверки статического типа python устанавливать тип переменной так, чтобы он соответствовал типу внутри определенного набора.

Я уже некоторое время осматриваюсь и не могу найти способ ссылаться на исходный набор таким образом, чтобы он определял тип новой переменной. Я мог бы сделать что-то вроде следующего, где я просто использую ту же ссылку на тип, что и внутри объявления set…

 my_set: Set[str] = {"a","b"}
def my_func(in_val:str):
   ...
 

но это было бы не идеально.

В идеале я мог бы сделать что-то вроде следующего…

scratch1.py

 import typing

my_set: typing.Set[str] = {"a","b","c"}

def my_func(in_val: TypeElement[my_set]):  # Or something like this
    print(in_val)

my_func("a")  # No error when running mypy
my_func(1)  # Error when running mypy
my_func("d")  # Possibly error, if possible, when running mypy
 

запуск в терминале

 $ mypy scratch1.py
scratch1.py:9: error: Argument 1 to "my_func" has incompatible type "int"; expected "str"
 

Комментарии:

1. Что плохого в жестком кодировании str типа? Вы уже жестко запрограммировали то, что my_set назначено, поэтому мне непонятно, почему вы возражаете против жесткого кодирования типов параметров, которые работают с этой переменной. Можете ли вы пояснить, почему вы пытаетесь это сделать? Возможно, есть решение, которое лучше работает с вашим базовым вариантом использования.

2. Причина, по которой я хотел бы ссылаться на «my_set» в типе для ввода, заключается в том, что независимо от того, что находится в наборе «my_set», я хочу иметь возможность соответствовать типу. В этом случае, если кто-то читает код или по какой-то причине изменяется содержимое «my_set», я бы хотел, чтобы люди поняли, что причина типа ввода связана с «my_set». Другая причина, по которой я хочу это сделать, заключается в том, что я хочу в некоторой функции проверить, находится ли входное значение в наборе. Я предполагаю, что это будет некоторая логическая проверка, хотя и с помощью вызова функции.