SimpleCookie 通用类型
SimpleCookie generic type
SimpleCookie
显然是泛型类型,因此以下代码 (test.py) 在使用 mypy
:
检查时会出错
from http.cookies import SimpleCookie
cookie = SimpleCookie()
test.py:3: error: Need type annotation for 'cookie'
现在,如果我将 test.py 第 3 行更改为:
cookie: SimpleCookie = SimpleCookie()
我收到以下错误:
test.py:3: error: Missing type parameters for generic type "SimpleCookie"
SimpleCookie
继承自 dict
,具有 str
键和 Morsel
值,所以我假设正确的通用类型注释是这样的:
from http.cookies import Morsel, SimpleCookie
cookie: SimpleCookie[str, Morsel] = SimpleCookie()
但是现在错误是:
test.py:3: error: "SimpleCookie" expects 1 type argument, but 2 given
将第 3 行更改为
cookie: SimpleCookie[str] = SimpleCookie()
突然让 mypy
高兴,但让我很困惑为什么这是正确的解决方案,所以我有两个问题:
- 为什么
SimpleCookie
是一个只有一个参数的泛型类型?
- 在我的代码中处理这个问题的最佳方法是什么?我应该用
SimpleCookie[str]
注释 SimpleCookie
变量(这对我来说似乎是个谎言)还是我应该只用 Any
注释它们并希望这将在将来被清理 Python版本?
mypy
版本 0.750 和 Python 3.8.0
说明
SimpleCookie[str]
中的str
其实是指Morsel
中coded_value
的类型_T
。
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:
中所述
Morsel does cast any value to string ... max-age can take an integer (unix time) and http-only a boolean.
实际上,我无法重现您遇到的错误:
from http.cookies import SimpleCookie
cookie: SimpleCookie = SimpleCookie()
SimpleCookie
显然是泛型类型,因此以下代码 (test.py) 在使用 mypy
:
from http.cookies import SimpleCookie
cookie = SimpleCookie()
test.py:3: error: Need type annotation for 'cookie'
现在,如果我将 test.py 第 3 行更改为:
cookie: SimpleCookie = SimpleCookie()
我收到以下错误:
test.py:3: error: Missing type parameters for generic type "SimpleCookie"
SimpleCookie
继承自 dict
,具有 str
键和 Morsel
值,所以我假设正确的通用类型注释是这样的:
from http.cookies import Morsel, SimpleCookie
cookie: SimpleCookie[str, Morsel] = SimpleCookie()
但是现在错误是:
test.py:3: error: "SimpleCookie" expects 1 type argument, but 2 given
将第 3 行更改为
cookie: SimpleCookie[str] = SimpleCookie()
突然让 mypy
高兴,但让我很困惑为什么这是正确的解决方案,所以我有两个问题:
- 为什么
SimpleCookie
是一个只有一个参数的泛型类型? - 在我的代码中处理这个问题的最佳方法是什么?我应该用
SimpleCookie[str]
注释SimpleCookie
变量(这对我来说似乎是个谎言)还是我应该只用Any
注释它们并希望这将在将来被清理 Python版本?
mypy
版本 0.750 和 Python 3.8.0
说明
SimpleCookie[str]
中的str
其实是指Morsel
中coded_value
的类型_T
。
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:
Morsel does cast any value to string ... max-age can take an integer (unix time) and http-only a boolean.
实际上,我无法重现您遇到的错误:
from http.cookies import SimpleCookie
cookie: SimpleCookie = SimpleCookie()