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 目前没有任何关于在类型检查阶段传播或提取任何给定变量的实际 值 的规定。
以完全通用的方式实现它实际上非常具有挑战性,因此不太可能很快添加此功能(如果是,它的形式可能会更加有限)。
我在 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 目前没有任何关于在类型检查阶段传播或提取任何给定变量的实际 值 的规定。
以完全通用的方式实现它实际上非常具有挑战性,因此不太可能很快添加此功能(如果是,它的形式可能会更加有限)。