Подсказки по типу и перегрузка для параметра типаPython

Программы на Python
Ответить
Anonymous
 Подсказки по типу и перегрузка для параметра типа

Сообщение Anonymous »

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

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

from typing import overload, Literal, Union
from os import environ

@overload
def get_var(name: str, mytype: Literal[str]) -> str: ...

@overload
def get_var(name: str, mytype: Literal[int]) -> int: ...

@overload
def get_var(name: str, mytype: Literal[float]) -> float: ...

@overload
def get_var(name: str, mytype: Literal[bool]) -> bool: ...

def get_var(name: str, mytype: type = str) -> Union[str, int,float, bool]:
val = environ[name]
if mytype == str:
return str(val)
if mytype == int or mytype == float:
return type(val)
if mytype == bool:
return val.lower()[0] == "t"
raise ValueError(f"Unsupported type: {mytype}")
Сама функция работает нормально. Однако не существует такой вещи, как Literal[str] (или Literal любого из других перечисленных типов).
Таким образом, это не удается, потому что перегрузка не удалась. Если я удалю всю перегрузку, то тип возвращаемого значения будет str | интервал | плавать | bool, что вызывает всевозможные проблемы в моей IDE, когда я хочу использовать любую из возвращаемых переменных.
Я не хочу искать способ обойти проблему с перегрузкой и литералами, используя что-то вроде:

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

@overload
def get_var(name: str, mytype: Literal["str"]) -> str
.
.
.

def get_var(name: str, mytype: str) -> Union[str, int, float, bool]
могу ли я этого избежать, потому что мне бы хотелось, чтобы передаваемый тип был реальным типом, а не просто строкой, представляющей тип. Таким образом я могу делать такие вещи, как:

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

my_type = type(old_param)
new_param = get_var("my_hyperparameter", my_type)
Другими словами, get_var был бы гораздо более удобным для пользователя, если бы my_type мог быть фактическим типом (, int и т. д.) вместо строки, в которой просто написано «str», «int» и т. д.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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