7

我在 Python 3.5 中编写了这段代码:

from collections import namedtuple

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

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

错误:列表或元组文字应作为第二个参数namedtuple()

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

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

但它并没有解决引发的错误。

4

2 回答 2

10

如果您希望 mypy 了解您的命名元组是什么样的,您应该NamedTupletyping模块中导入,如下所示:

from typing import NamedTuple

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

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

from typing import NamedTuple

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

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

以一种完全通用的方式实现这一点实际上是非常具有挑战性的,所以这个功能不太可能很快就会被添加(如果是的话,它可能会以更有限的形式出现)。

于 2017-06-20T05:19:07.370 回答
4

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

尽管# type: ignore实际上确实使此警告静音,但它会产生其他问题,因此,如果可以,请不要依赖于动态指定 namedtuple 的字段名称(即以迈克尔的答案提供的方式提供文字)。

于 2017-06-19T19:46:52.260 回答