mypy error: List or tuple literal expected as the second argument to namedtuple()

mypy error: List or tuple literal expected as the second argument to namedtuple()

我在 Python 3.5:

中写了这段代码
from collections import namedtuple

attributes = ('content', 'status')
Response = namedtuple('Response', attributes)

当我 运行 Mypy 类型检查器分析这段代码时,它引发了错误:

error: List or tuple literal expected as the second argument to namedtuple()

我尝试向 attributes 变量添加类型注释:

from typing import Tuple
attributes = ('content', 'status')  # type: Tuple[str, str]

但它没有修复引发的错误。

根据 mypy 问题跟踪器上的 issue 848,这将永远不会实现(请参阅 GvR 的最后一条消息)。

虽然 # type: ignore 实际上确实消除了这个警告,但它随后会产生其他问题,因此,如果可以的话,不要依赖于动态指定 namedtuple 的字段名称(即以 Michael 的方式提供文字答案提供)。

如果你想让 mypy 理解你的命名元组是什么样的,你应该从 typing 模块导入 NamedTuple,像这样:

from typing import NamedTuple

Response = NamedTuple('Response', [('content', str), ('status', str)])

然后,您可以像使用任何其他命名元组一样使用 Response,除了 mypy 现在可以理解每个单独字段的类型。如果您使用的是 Python 3.6,您还可以使用替代的基于 class 的语法:

from typing import NamedTuple

class Response(NamedTuple):
    content: str
    status: str

如果您希望动态改变字段并编写可以在运行时 "build" 不同命名元组的东西,不幸的是,这在 Python 的类型生态系统中是不可能的。 PEP 484 目前没有任何关于在类型检查阶段传播或提取任何给定变量的实际 的规定。

以完全通用的方式实现它实际上非常具有挑战性,因此不太可能很快添加此功能(如果是,它的形式可能会更加有限)。