python - 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
很高兴,但让我很困惑为什么这是正确的解决方案,所以我有两个问题:
- 为什么
SimpleCookie
泛型类型只有一个参数? - 在我的代码中处理这个问题的最佳方法是什么?我应该用(这对我来说似乎是一个谎言)来注释
SimpleCookie
变量还是应该只用它们来注释它们并希望这将在未来的 Python 版本中得到清理?SimpleCookie[str]
Any
mypy
版本 0.750 和 Python 3.8.0
解决方案
解释
str
inSimpleCookie[str]
实际上是指in的类型_T
。coded_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中所述:
Morsel 确实将任何值转换为字符串... max-age 可以采用整数(unix 时间)和 http-only 一个布尔值。
实际上,我无法重现您遇到的错误:
from http.cookies import SimpleCookie
cookie: SimpleCookie = SimpleCookie()
推荐阅读
- iphone - 仅在特定设备上安装 iOS ipa
- laravel - Laravel 尝试排队作业,触发新尝试的正确方法?
- java - 如何使用 Rest Assured-Java 为 JSON 正文中的参数赋值
- c# - 线程完成后捕获异常
- javascript - 如何计算代码镜像中未保存的更改
- spring - 使用 spring kafka 中的注释为每个主题单独的 Kafka 侦听器
- lucene - 无法在数据狗日志中搜索 $
- java - isEmpty() 如何在幕后工作
- composer-php - 如何更新 phpunit 6 和代码覆盖率 5
- email - 如何将营销电子邮件发送到 Gmail 而不会成为垃圾邮件?