SimpleCookie通用类型

问题描述 投票:7回答:1

SimpleCookie显然是通用类型,因此当用mypy检查时,以下代码(test.py)给出错误:

from http.cookies import SimpleCookie

cookie = SimpleCookie()

test.py:3:错误:'cookie'需要类型注释”>

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

cookie: SimpleCookie = SimpleCookie()

我收到以下错误:

test.py:3:错误:通用类型“ SimpleCookie”缺少类型参数

[SimpleCookiedict继承,具有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来注释SimpleCookie[str]变量(对我来说似乎是骗人的)还是应该只用Any对其进行注释,并希望在将来的Python版本中将其清除?

[mypy版本0.750和Python 3.8.0

SimpleCookie显然是通用类型,因此以下代码(test.py)在与mypy一起检查时给出错误:从http.cookies import SimpleCookie cookie = SimpleCookie()test.py:3:...

说明

str中的[SimpleCookie[str]实际上是指_Tcoded_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中所述:

Morel不会将任何值强制转换为字符串... max-age可以采用整数(unix时间),而http只能是布尔值。

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

from http.cookies import SimpleCookie

cookie: SimpleCookie = SimpleCookie()
python mypy python-3.8
1个回答
6
投票

说明

© www.soinside.com 2019 - 2024. All rights reserved.