Как писать подсказки типа при изменении типа переменной?Python

Программы на Python
Ответить
Anonymous
 Как писать подсказки типа при изменении типа переменной?

Сообщение Anonymous »

Скажи, что да

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

def foo(x: Union[str, list[str]], y: Union[str, list[str]]) -> tuple[list[str], list[str]]:

x = cast(Union[list[str], tuple[list[str], ...]], str2list(x))
y = cast(Union[list[str], tuple[list[str], ...]], str2list(y))

return x,y

def str2list(*args: Union[str, list[str]]) -> Union[list[str], tuple[list[str], ...]]:
vals = []
for x in args:
if not isinstance(x, list):
x = [x]
vals.append(x)
if len(args) == 1:
return vals[0]
else:
return tuple(vals)

x = 'My name is x'
y = ['First element', 'Second element']

z = str2list(x,y)
Как видите, в foo есть два вызова, но mypy все равно жалуется, что

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

error: Incompatible types in assignment (expression has type "Union[List[str], Tuple[List[str], ...]]", variable has type "Union[str, List[str]]")  [assignment]
Обходным решением может быть определение новых переменных и настройка возвращаемого типа foo следующим образом:

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

def foo(
x: Union[str, list[str]], y: Union[str, list[str]]
) -> tuple[
Union[list[str], tuple[list[str], ...]],
Union[list[str], tuple[list[str], ...]],
]:

xl = cast(Union[list[str], tuple[list[str], ...]], str2list(x))
yl = cast(Union[list[str], tuple[list[str], ...]], str2list(y))

return xl, yl
Но я бы предпочел перезаписать x и y, а не определять две новые переменные xl и yl.

Подробнее здесь: https://stackoverflow.com/questions/736 ... a-variable
Ответить

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

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

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

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

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