You need to enable JavaScript to run this app. Python中作为函数参数的requests库如何标注合适的类型提示?
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 13:42:04