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]实际上是指_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中所述:



    实际上,我无法重现此错误:

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

    09-06 07:56