python - 如何在Python3.7/3.8中使用通用namedtuple?

标签 python generic-programming namedtuple type-annotation

我尝试在 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

最佳答案

感谢@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 都知道返回类型并且自动完成工作正常!

关于python - 如何在Python3.7/3.8中使用通用namedtuple?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58621195/

相关文章:

python collections.namedtuple() 混淆

python - 如何删除表中的列,其中列名是mysql中的 "index"和 "Unnamed: 0"

c++ - 在 boost::variant 中调用类型通用的方法

haskell - 我可以使用 `Traversal` 获取存储在分支中的项目的 `Control.Lens.Plated` 吗?

Python:从namedtuple列表中获取参数值列表

python - 通过键入创建 NamedTuple 时引发 TypeError

来自信号处理程序的 sys.exit() 上的 Python 核心转储

python - 为什么 'and' 和 'or' 在 Python 中返回操作数?

python - 摆脱 Python 中日期字符串的前导零?

c++ - 创建一个使用模板创建类或子类对象的函数