首页 > 解决方案 > 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”的类型参数

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变量还是应该只用它们来注释它们并希望这将在未来的 Python 版本中得到清理?SimpleCookie[str]Any

mypy版本 0.750 和 Python 3.8.0

标签: pythonmypypython-3.8

解决方案


解释

strinSimpleCookie[str]实际上是指in的类型_Tcoded_valueMorsel

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()

推荐阅读