【问题标题】:Can I send **kwargs in place of set parameter in requests.post?我可以发送 **kwargs 来代替 requests.post 中的 set 参数吗?
【发布时间】:2021-03-03 20:34:30
【问题描述】:

我正在尝试设置一个包含常用 REST 方法的基类,以便在以后的测试框架中由更具体的方法使用。我决定,与其创建与传入datajsonfiles 参数的用户相对应的不同request.post 方法,不如创建一种具有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, headers=self.requestHeaders, self.kwargs)

SyntaxError: positional argument follows keyword argument

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

【问题讨论】:

  • 调用时需要**来扩展字典,否则你只是将它作为一个位置参数传递。

标签: python rest python-requests keyword-argument


【解决方案1】:

如果您希望kwargs 被视为提供给post 的关键字参数,您需要使用** 来应用它们:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-06
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    相关资源
    最近更新 更多