我的 IDE (PyCharm) linter 表明我在函数中创建
return
时在 namedtuple
类型提示上犯了错误。问题似乎是我说我将返回类型 NamedTuple
,而实际上我正在返回类型 MyNamedTuple
。我该如何解决这个问题?
示例:
from typing import Dict, NamedTuple
def foo(bar: Dict) -> NamedTuple:
MyNamedTuple = NamedTuple("MyNamedTuple", [(k, int) for k in bar.keys()])
d = {k: v for k, v in bar.items()}
return MyNamedTuple(**d)
>>> foo({"a": 1, "b": 2})
MyNamedTuple(a=1, b=2)
我认为这个问题源于一个轻微的误解:官方文档指出
NamedTuple
是“namedtuple
的打字版本”。这并不是说 NamedTuple
本身可以用作类型提示。
您定义的
foo
的返回类型实际上是 MyNamedTuple
。逐行分解:
MyNamedTuple
的 type(即类),其字段源自
bar
的键。bar
复制到d
(此行是多余的)MyNamedTuple
正如您问题的评论中所建议的,解决方案是将提示注释设置为
"MyNamedTuple"
:
def foo(bar: Dict) -> "MyNamedTuple":
MyNamedTuple = NamedTuple("MyNamedTuple", [(k, int) for k in bar.keys()])
# d = {k: v for k, v in bar.items()}
return MyNamedTuple(**bar)