SimpleCookie
显然是通用类型,因此以下代码(test.py)在使用mypy
检查时给出了错误:
from http.cookies import SimpleCookie
cookie = SimpleCookie()
现在,如果我将test.py第3行更改为:
cookie: SimpleCookie = SimpleCookie()
我收到以下错误:
SimpleCookie
继承自dict
,具有str
键和Morsel
值,因此我假设正确的泛型类型注释如下所示:from http.cookies import Morsel, SimpleCookie
cookie: SimpleCookie[str, Morsel] = SimpleCookie()
但是现在错误是:
将第3行更改为
cookie: SimpleCookie[str] = SimpleCookie()
突然让
mypy
感到高兴,但是让我非常困惑,为什么这是正确的解决方案,所以我有两个问题:SimpleCookie
是带有一个参数的泛型? SimpleCookie
注释SimpleCookie[str]
变量(这对我来说似乎是骗人的),还是应该只用Any
注释它们,并希望在将来的Python版本中可以解决此问题? mypy
版本0.750和Python 3.8.0 最佳答案
解释str
中的SimpleCookie[str]
实际上是指_T
中coded_value
的Morsel
类型。mypy
使用https://github.com/python/typeshed/blob/master/stdlib/3/http/cookies.pyi:
class Morsel(Dict[str, Any], Generic[_T]):
value: str
coded_value: _T
key: str
def set(self, key: str, val: str, coded_val: _T) -> None: ...
# ...
class BaseCookie(Dict[str, Morsel[_T]], Generic[_T]):
# ...
def value_decode(self, val: str) -> _T: ...
def value_encode(self, val: _T) -> str: ...
# ...
def __setitem__(self, key: str, value: Union[str, Morsel[_T]]) -> None: ...
class SimpleCookie(BaseCookie[_T], Generic[_T]): ...
正确输入
_T
应该是Any
,即SimpleCookie[Any]
,如python/typeshed#3060中所述:实际上,我无法重现此错误:
from http.cookies import SimpleCookie
cookie: SimpleCookie = SimpleCookie()