如何在函数中用*args/**kwargs灵活传入HTTP请求参数适配多场景?
灵活传递requests请求参数的解决方案
问题场景
你想封装一个make_some_request函数,让它能接收不同组合的HTTP请求参数,比如某次调用传url、headers和params,另一次传url和timeout,内部要正确对应requests.get的参数格式:
- 第一次调用内部执行:
requests.get(url, headers=headers, params=parameters) - 第二次调用内部执行:
requests.get(url, timeout=timeout)
之前尝试单一*args或**kwargs都没满足需求,下面是解决方法:
解决方法:同时使用*args和**kwargs
调整函数定义,同时接收位置参数和关键字参数,直接透传给requests.get即可:
def make_some_request(self, *args, **kwargs): response = requests.get(*args, **kwargs) return response
调用示例
- 包含url、headers和params的调用:
# 传入url作为位置参数,headers和params作为关键字参数 self.make_some_request(url, headers=headers, params=parameters)
此时内部会自动映射为requests.get(url, headers=headers, params=parameters)。
- 包含url和timeout的调用:
# 传入url作为位置参数,timeout作为关键字参数 self.make_some_request(url, timeout=timeout)
此时内部会自动映射为requests.get(url, timeout=timeout)。
原理说明
*args用来接收requests.get要求的第一个位置参数(url),也可以兼容其他合法的位置参数;**kwargs用来接收所有关键字参数(比如headers、params、timeout等);- 两者结合就能完美适配
requests.get的所有参数组合,不管你是传位置参数还是关键字参数,都能正确透传。
内容的提问来源于stack exchange,提问作者JJH
相关产品推荐
相关产品推荐

