Python中作为函数参数的requests库如何标注合适的类型提示?
request_client参数的合适类型提示方案
你的场景需要同时兼容requests库、自定义测试存根两类入参,核心是只要入参实现了你用到的get/post等HTTP方法即可,Python 3.9+自带的typing.Protocol(结构类型协议)刚好匹配这个需求,mypy 0.910对该特性的支持已经完全稳定。
具体实现步骤
1. 先定义HTTP客户端协议
协议只规定你实际用到的方法签名即可,不需要和任何实际类型绑定,只要对象的方法匹配签名,mypy就会认为它符合协议要求:
from typing import Protocol, Optional, Any, Union import requests # 自定义协议,描述你需要的HTTP客户端能力 class HttpClientProtocol(Protocol): def get( self, url: str, params: Optional[dict[str, Union[str, int]]] = None, **kwargs: Any ) -> requests.Response: # 如果存根会返回自定义的响应对象,可以改成Any ... # 如果用到POST方法,补充对应的签名即可 # def post( # self, # url: str, # data: Optional[dict[str, Any]] = None, # json: Optional[dict[str, Any]] = None, # **kwargs: Any # ) -> requests.Response: # ...
2. 给函数添加类型提示
def something(request_client: Optional[HttpClientProtocol] = None) -> None: if not request_client: request_client = requests request_client.get('https://example.com') # 其余业务逻辑
补充说明
- 这种写法不会限制你测试时的存根实现,只要存根实现了对应的
get/post方法,mypy就不会报错,完全满足你测试时传入存根的需求 - 如果你不需要严格校验响应类型,也可以把协议中方法的返回值改成
Any,灵活度更高
内容的提问来源于stack exchange,提问作者J B
相关产品推荐
相关产品推荐

