【问题标题】:Pass (optional) parameters to HTTP parameter (Python, requests)将(可选)参数传递给 HTTP 参数(Python、请求)
【发布时间】:2018-02-27 03:38:20
【问题描述】:

我目前正在开发 API Wrapper,但在将参数从函数传递到请求的负载时遇到了问题。参数可以是blockId、senderId、recipientId、limit、offset、orderBy。所有参数由“或”连接。一种可能的解决方案可能是对每种组合都有 if 语句,但我认为这是一种糟糕的方法。 (请求和常量已经导入)

def transactionsList(*args **kwargs):
    if blockId not None:
        payload = {'blockId': blockId}
    if offset not None:
        payload = {'offset': offset}
    ...
    r = requests.get(constants.TRANSACTIONS_LIST, params=payload, timeout=constants.TIMEOUT)
    return r

什么是(或者是)更优雅的方法来实现传递给请求有效负载的函数参数?

【问题讨论】:

    标签: python parameters python-requests parameter-passing


    【解决方案1】:

    最短的一个:

    PARAMS = ['blockid', 'senderid', 'recipientid', 'limit', 'offset', 'orderby']
    payload = {name: eval(name) for name in PARAMS if eval(name) is not None}
    

    【讨论】:

    • 您的答案无效,因为参数未存储在变量中。这意味着如果我使用function(a='hello'),我无法使用变量 a 访问“hello”,因为它存储在 kwargs[a] 中。
    • @Oxybound 您需要更加注意您提供的代码。你已经开始使用变量,而不是一开始就从 kwargs 中弹出它们,所以我根据它给了你一个提示。
    【解决方案2】:

    在修改了 Pythonist 的答案(因为总是出现 NameError 而没有奏效)之后,我想出了这个解决方案:

    def transactionsList(*args, **kwargs):
        payload = {name: kwargs[name] for name in kwargs if kwargs[name] is not None}
        r = requests.get(constants.TRANSACTIONS_LIST, params=payload, timeout=constants.TIMEOUT)
        # print(r.url)
        return r
    

    如您所见,重要的部分是有效载荷:

    payload = {name: kwargs[name] for name in kwargs if kwargs[name] is not None}
    

    只要 kwargs 数组中有一个参数(名称),如果它的值不是 None,它就会被添加到有效负载中。

    【讨论】:

    • 如果kwargs 的数量有限,则应将它们写入函数定义,而不是从**kwargs 中获取它们。这是编码的好习惯,特别是如果您希望将所有**kwargs 传递给params
    猜你喜欢
    • 2012-08-28
    • 1970-01-01
    • 2017-01-14
    • 2016-04-01
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多