Задать тип-подсказку для пользовательского подкласса List - TypeError: объект 'type' не может быть подписан - PullRequest
0 голосов
/ 13 февраля 2020

Я пытаюсь указать элементы возвращенного подкласса List с помощью typehinting .

from typing import Union, List, Tuple, Optional, NewType
from jira import JIRA
from jira.client import ResultList
from jira.resources import Issue

def search(...) -> ResultList[Issue]: # using 'List[Issue]:' or 'ResultList:' as return type hint work
    ...

Однако я работаю с этой ошибкой:

TypeError: объект 'type' не подходит для подписки

Я попытал счастья с NewType , но не смог запустить его так, как ожидалось. Если не указать подкласс ResultList[Issue] и использовать вместо него List[Issue], это работает. Кроме того, когда не упоминается тип элемента простым использованием ResultList, он работает.

Дополнительная информация:

ResultList Code

Код вопроса

1 Ответ

0 голосов
/ 13 февраля 2020

вы должны посмотреть на это:

объяснение:
список и typing.List - это совершенно разные вещи
, чтобы использовать generi c, вы должны наследовать от typing.Generi c
, если вы используете сторонний код libs и не могу внести изменения в ResultList , тогда заглушки - это решение
в основном вам нужно определить заглушку для ResultList класса в * .pyi файле так:

from typing import Generic, TypeVar, Iterable

T = TypeVar('T')

class ResultList(list, Generic[T]):
    def __init__(
        self, iterable: Iterable[T] = ..., _startAt: int = ..., _maxResults: int = ..., _total: int = ..., _isLast: bool = ...
    ) -> None:
        ...
    ...

после этого вы можете использовать следующую команду:

from unittest import TestSuite

from res import ResultList


class SomeClass:
    pass


def foo() -> 'ResultList[int]':
    return ResultList(iterable=[SomeClass()])


if __name__ == '__main__':
    a: 'ResultList[str]' = foo()
# pycharm will highlight "unexpected type error"

не забудьте подключить заглушки в pycharm, как показано в ссылке

...