SimpleCookie 泛型类型



SimpleCookie显然是一个泛型类型,因此以下代码(test.py(在使用mypy检查时给出错误:

from http.cookies import SimpleCookie
cookie = SimpleCookie()

test.py:3:错误:需要"cookie"的类型注释

现在,如果我 test.py 第 3 行更改为:

cookie: SimpleCookie = SimpleCookie()

我收到以下错误:

test.py:3:错误:泛型类型"简单饼干"的类型参数缺失

SimpleCookie继承自dict,具有str键和Morsel值,因此我假设正确的泛型类型注释如下所示:

from http.cookies import Morsel, SimpleCookie
cookie: SimpleCookie[str, Morsel] = SimpleCookie()

但现在的错误是:

test.py:3:错误:"SimpleCookie"需要 1 个类型参数,但给定 2

将第 3 行更改为

cookie: SimpleCookie[str] = SimpleCookie()

突然让mypy高兴,但让我很困惑为什么这是正确的解决方案,所以我有两个问题:

  1. 为什么SimpleCookie是一个带有一个参数的泛型类型?
  2. 在我的代码中处理此问题的最佳方法是什么?我应该用SimpleCookie[str]注释SimpleCookie变量(这对我来说似乎是个谎言(,还是应该用Any注释它们并希望在未来的 Python 版本中
  3. 清理它们?

mypy版本 0.750 和 Python 3.8.0

解释

SimpleCookie[str]中的str实际上是指Morselcoded_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 确实将任何值转换为字符串...max-age 可以采用整数(UNIX 时间(,而 http-only 可以采用布尔值。

实际上,我无法重现您遇到的错误:

from http.cookies import SimpleCookie
cookie: SimpleCookie = SimpleCookie()

相关内容

  • 没有找到相关文章

最新更新