Как использовать обобщенный namedtuple в Python3.7 / 3.8? - PullRequest
1 голос
/ 30 октября 2019

Я пытаюсь использовать функцию универсального именованного кортежа в Python 3.7 (и 3.8), но интерпретатор выдает ошибку. Я использую плохой путь?

from typing import NamedTuple, TypeVar, Generic
from dataclasses import dataclass

@dataclass
class Person:
    name: str
    age: int


T = TypeVar("T")
class MyResult(NamedTuple, Generic[T]):
    Body: T
    Status: int


def func1() -> MyResult[Person]:
    return MyResult(Person('asghar',12), 200)

Возникает следующая ошибка:

Traceback (most recent call last):
  File "/Users/kamyar/Documents/generic_named_tuple.py", line 16, in <module>
    def func1() -> MyResult[Type[Person]]:
TypeError: 'type' object is not subscriptable

1 Ответ

1 голос
/ 30 октября 2019

Благодаря @ shynjax287 я использовал обходной путь для исправления кода:

from typing import NamedTuple, TypeVar, Generic, Type
from dataclasses import dataclass

@dataclass
class Person:
    name: str
    age: int


T = TypeVar("T")

class MyResult(NamedTuple):
    Body: T
    Status: int

class MyResultGeneric(MyResult, Generic[T]):
    pass


def func1() -> MyResultGeneric[Person]:
    return MyResultGeneric[Person](Person('asghar',12), 200)

print(func1().Body.name)

Даже PyCharm знает типы возвращаемых данных и автозаполнение работает отлично!

...