Ниже приведен более простой пример, отражающий проблему, которую я пытаюсь решить:
Код: Выделить всё
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}")
Таким образом, это не удается, потому что перегрузка не удалась. Если я удалю всю перегрузку, то тип возвращаемого значения будет 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)
Код: Выделить всё
str
Мобильная версия