【问题标题】:How to iterate over list of lists while passing each value in the lists into API and pausing after each list of list?如何迭代列表列表,同时将列表中的每个值传递到 API 并在每个列表列表之后暂停?
【发布时间】:2019-01-23 17:15:04
【问题描述】:

我有一个如下所示的列表:

lst = [1,2,3, etc]

我可以成功地遍历这个列表并将 ID 传递给 API。然而,关于我传递的 Id 数量的某个点之后,API 会中断。

我继续使用以下代码将列表分成 50 个块:

def chunks(l, n):
    # For item i in a range that is a length of l,
    for i in range(0, len(l), n):
        # Create an index range for l of n items:
        yield l[i:i+n]

a = list(chunks(lst, 50))

a 变量是如下所示的列表列表:

[[1,2,3][4,5,6]]

如何遍历列表,将各个 ID 传递到 API 代码(如下),同时在每个块之后暂停代码 10 秒?

此外,如果 API 中断,我是否可以强制 API 继续其余代码?现在不是必需的,所以这是可选的。

API 代码:

lst1=[]
for i in lst:
    #print (row)
    url = 'url/Id={}'.format(i)
    r = requests.get(url).text
    lst1.append(xml_data1)
    #time.sleep(1)
    print(xml_data1)

提前谢谢你。

【问题讨论】:

    标签: python python-3.x list loops api-design


    【解决方案1】:

    在执行内部循环后,您可以使用双 for 循环和 sleep 函数。这是一个例子:

    lst1 = []
    for chunk in a:
        for id in chunk:
            url = 'url/Id={}'.format(id)
            xml_data = requests.get(url).text
            lst1.append(xml_data)
         sleep(10) # will pause execution for 10 seconds
    

    要回答关于如果 API 抛出错误时如何继续执行的第二个问题,您可以使用try/except。可能引发错误的代码位于try 块中,如果引发错误,则执行移至except 块,该块指定如何继续。如果您将代码包装在一个函数中,这可以变得更容易一些。

    我发现跟踪您尝试使用可用于指数退避的关键字参数调用特定 id 的次数很有帮助 - 您等待更长的时间取决于多少次你试过了。

    以下是基于上述代码构建的示例:

    def get_data_on_id(id, try_num=1):
        url = 'url/Id={}'.format(id)
        try:
            return requests.get(url).text
        except:
            sleep(2**try_num) # exponential backoff
            return get_data_on_id(id, try_num=try_num + 1)
    
    lst1 = []
    for chunk in a:
        for id in chunk:
            xml_data = get_data_on_id(id)
            lst1.append(xml_data)
        sleep(10)
    

    上面的代码与之前的代码基本相同,但请求逻辑被包装在get_data_on_id 函数中,该函数包含try/except 块。如果在请求url时抛出错误,该函数将等待2^try_num秒,然后重试。

    您可能还希望except 特定错误并以不同方式处理它们(或者只是为了明确说明您只准备处理except 错误)。以下是try/except 上的文档:https://docs.python.org/3/tutorial/errors.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-08
      • 2019-03-29
      • 1970-01-01
      • 1970-01-01
      • 2021-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多