我可以发送 **kwargs 代替 requests.post 中的设置参数吗?

问题描述

我正在尝试设置一个包含常见 REST 方法的基类,以便在以后的测试框架中由更具体的方法使用。我决定不创建对应于用户传入 request.postdatajson 参数的不同 files 方法,而是创建一个具有集合的方法url 和 header 的参数,并让用户在 **kwargs 中传递他们想要的任何其他内容。但是,我不确定在这种情况下我什至可以使用 *kwargs,因为 requests 模块似乎需要一个位置参数。这是我目前所拥有的:

class Action:

    def __init__(self,url,requestHeaders,**kwargs):
        self.url = url
        self.requestHeaders = requestHeaders
        self.kwargs = kwargs

    def postAction(self):
        response = requests.post(self.url,headers=self.requestHeaders,self.kwargs)
        resultCode = response.status_code
        resultMessage = response.text
        print(resultCode)
        print(resultMessage)
        return  resultCode,resultMessage

例如,kwargs 可能包含 files={'csv': ('/path/to/csv.csv',open('csv.csv,'rb'),'text/csv')}verify=false。在另一个请求中,files 可能会替换为 data。然而,当我尝试测试时,我最终得到了这个:

Traceback (most recent call last):
  File "/home/user1/test/action.py",line 24
    response = requests.post(self.url,self.kwargs)

SyntaxError: positional argument follows keyword argument

我正在尝试做的事情可能吗?如果没有,还有其他选择吗?

解决方法

如果您希望将 kwargs 视为赋予 post 的关键字参数,则需要使用 ** 来应用它们:

response = requests.post(self.url,headers=self.requestHeaders,**self.kwargs)

这类似于序列解包(*seq),将导致数据“扩展”到调用的参数列表中。