Сочетание mypy Union и вложенного TypedDict приводит к ошибке mypy: несовместимое возвращаемое значение - PullRequest
1 голос
/ 03 марта 2020

Я хотел бы объединить TypedDict с Union. Так что функция может вернуть либо A, либо B. Mypy может правильно определять тип возврата TypedDict напрямую. Но когда TypedDict вложено в Union, оно не работает.

from typing_extensions import TypedDict
from typing import Union


class A(TypedDict):
    a: str


class B(TypedDict):
    b: str


def works() -> A:
    return {'a': 'value'}
    # Works as expected


def problem() -> Union[A, B]:
    return {'a': 'value'}
    # mypy_error: Incompatible return value type (got "Dict[str, str]", expected "Union[A, B]")
    # Reports an error while it should be valid


def workaround() -> Union[A, B]:
    x: A = {'a': 'value'}

    return x
    # This works again but is not very elegant

Возможный обходной путь - назначить временную возвращаемую подсказку типа (см. workaround()). Есть ли более элегантный способ сделать это?

Примечание: Python 3.7

1 Ответ

2 голосов
/ 03 марта 2020

Цитата из PEP 589 :

Обычно требуется явная аннотация типа [TypedDict], так как в противном случае обычный тип словаря может быть принят проверщиком типа, для обратная совместимость. Когда средство проверки типов может сделать вывод, что созданный объект словаря должен быть TypedDict, явная аннотация может быть опущена.

Так что нет ничего плохого в том, чтобы явно определить тип в вашем коде. Другой возможностью является непосредственное создание экземпляра A:

def problem() -> Union[A, B]:
    return A(a='value')

Хотя это, конечно, только сахар syntacti c и будет заменен на dict во время выполнения.

...