[在玩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版本是3.7.4。根据文档说明,TypedDict是使用Pythhon 3.8添加到键入模块中的。
这是您的问题。 typing
模块是Python标准库的一部分,而不是mypy的一部分。您需要升级到Python 3.8才能使用TypedDict。