Рекурсивные типы в Python и трудности с определением типа `type(x)(...)`Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Рекурсивные типы в Python и трудности с определением типа `type(x)(...)`

Сообщение Anonymous »

Пытаясь создать рекурсивные типы для аннотирования вложенной структуры данных, я наткнулся на следующее.
Этот код верен согласно mypy:

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

IntType = int | list["IntType"] | tuple["IntType", ...]
StrType = str | list["StrType"] | tuple["StrType", ...]

def int2str(x: IntType) -> StrType:
if isinstance(x, list):
return list(int2str(v) for v in x)
if isinstance(x, tuple):
return tuple(int2str(v) for v in x)
return str(x)
Но не этот, который должен быть эквивалентен:

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

IntType = int | list["IntType"] | tuple["IntType", ...]
StrType = str | list["StrType"] | tuple["StrType", ...]

def bad_int2str(x: IntType) -> StrType:
if isinstance(x, (list, tuple)):
return type(x)(bad_int2str(v) for v in x)  # error here
return str(x)
Сообщение об ошибке

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

line 6: error: Incompatible return value type (
got "list[int | list[IntType] | tuple[IntType, ...]] | tuple[int | list[IntType] | tuple[IntType, ...], ...]",
expected "str | list[StrType] | tuple[StrType, ...]"
)  [return-value]
line 6: error: Generator has incompatible item type
"str | list[StrType] | tuple[StrType, ...]";
expected "int | list[IntType] | tuple[IntType, ...]"  [misc]
Я предполагаю, что mypy может сделать вывод, что type(x) представляет собой либо список, либо кортеж.
Это ограничение mypy или с этим кодом что-то подозрительное?
Если да, то откуда берется ограничение?

Подробнее здесь: https://stackoverflow.com/questions/787 ... e-of-typex
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Рекурсивные типы в Python и трудности с определением типа `type(x)(...)`
    Anonymous » » в форуме Python
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Как отправить сигнал "ctrl+c" / sigint, чтобы Gradle javaexec type type type jvm?
    Anonymous » » в форуме JAVA
    0 Ответы
    28 Просмотры
    Последнее сообщение Anonymous
  • Привязка ссылки типа «type» к значению типа «const type» удаляет квалификатор «const»
    Гость » » в форуме C++
    0 Ответы
    131 Просмотры
    Последнее сообщение Гость
  • Рекурсивные универсальные типы
    Anonymous » » в форуме C#
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • Создать рекурсивные типы во время выполнения [дублировать]
    Anonymous » » в форуме Python
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous

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