使用Mypy和存根文件时出错:模块'typing'没有属性'TypedDict';也许是“ _TypedDict”?

问题描述 投票:0回答:1

[在玩mypy时,我创建了一个“存根文件”(__init__.pyi)以注册类型提示并对其进行测试(test.py)。

# my_package/__init__.py
foo = "bar"
# my_package/__init__.pye
from typing import Protocol, TypedDict
foo: str
# test.py
import my_package
my_package.foo = 42

虽然我对mypy运行test.py,但会产生以下错误:

$ mypy test.py
my_package/__init__.pyi:1: error: Module 'typing' has no attribute 'TypedDict'; maybe "_TypedDict"?
test.py:2: error: Incompatible types in assignment (expression has type "int", variable has type "str")
Found 2 errors in 2 files (checked 1 source file)

预期会出现“不兼容类型”警告,但我很难理解为什么mypy无法导入TypedDict

pip freeze输出为:

mypy==0.740
mypy-extensions==0.4.3
typed-ast==1.4.0
typing-extensions==3.7.4.1

我的Python版本是3.7.4。根据文档,在Python 3.8中TypedDict已添加到typing模块中。但是,对于Protocol也是这样,但不会引发警告。另外,尝试从Python解释器导入它们会引发异常,因此我认为mypy在解析存根文件时不依赖于Python可执行版本。

有人能解释一下为什么我要为TypedDict而不是Protocol出现此错误吗?

python mypy
1个回答
0
投票

我的Python版本是3.7.4。根据文档说明,TypedDict是使用Pythhon 3.8添加到键入模块中的。

这是您的问题。 typing模块是Python标准库的一部分,而不是mypy的一部分。您需要升级到Python 3.8才能使用TypedDict。

© www.soinside.com 2019 - 2024. All rights reserved.