【问题标题】:Loop until list is not empty in Python循环直到列表在Python中不为空
【发布时间】:2022-01-19 06:46:30
【问题描述】:

我正在开发一个有两个类的网络抓取工具。一个获取数据,另一个类处理它。第一个类的最终结果是一个元素列表,例如results = [1, 2, 3, 4, 5, ...] 。问题是有时,由于服务器端错误,列表可能为空。如何循环遍历此过程以重新启动该过程,直到列表不为空?

我有点像这样解决了它。但我不确定这是有效还是好的做法。

class DataScrapper:
      def __init__(self):
         ...
      
      def getData(self):
         self.results = []
         while not self.results:
              ...
         return self.results

这是解决问题的pythonic方法吗?还有其他更有效的方法吗?非常感谢。

【问题讨论】:

  • 这似乎更像是一个商业逻辑,而不是python技术问题。
  • 如果... 是服务器端调用,由于对服务器的请求过多,这可能会将您列入黑名单。您最好接受空列表并将其作为回报 - 或引发异常。
  • 这似乎是一个很好且明确的方法。您可能希望在尝试之间添加延迟和最大尝试次数,但这看起来不错。
  • 看看这个来自 AWS 的简短 API 指南(建议我上面的评论者的建议):docs.aws.amazon.com/general/latest/gr/api-retries.html
  • 谢谢大家!在重构代码时,我会牢记这一点。非常感谢!!

标签: python list loops


【解决方案1】:

你的习语很简单,适用于大多数情况。

但是你必须记住两件事:

  1. 您没有限制重试次数。如果服务器长时间宕机,你的脚本就会卡住。
  2. 即使在停机期间,您也会继续生成请求。这可能会导致较大的客户端和服务器负载。我强烈建议使用指数退避策略。

在 google 中快速搜索找到了backoff 库,它允许您同时执行这两个操作:

@backoff.on_predicate(backoff.expo, lambda x: x == [], max_tries=10)
def getData(self):
     self.results = []
     ...
     return self.results

它检查返回值,如果它是一个空列表,则再次运行该函数,并增加延迟,直到达到 10 次尝试。

【讨论】:

  • 非常感谢您的宝贵时间和建议!我会试试这个:)
猜你喜欢
  • 2021-05-25
  • 1970-01-01
  • 1970-01-01
  • 2021-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-09
  • 1970-01-01
相关资源
最近更新 更多