【问题标题】:Return empty list instead of TimeoutError if function times out如果函数超时,则返回空列表而不是 TimeoutError
【发布时间】:2022-01-11 04:56:49
【问题描述】:

我有一个函数当前使用@timeout_decorator 装饰器在几秒钟后使函数超时。但是,我不想让函数超时,而是返回一个空列表[]。如有必要,我愿意使用其他包/装饰器,只要它们可以通过 PyPi 轻松安装。这是我当前的代码:

import timeout_decorator
import requests
from bs4 import BeautifulSoup as bs

@timeout_decorator.timeout(5, use_signals=False)
def get_soup(url):
    session = requests.Session()
    # set the User-agent as a regular browser
    session.headers["User-Agent"] = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36"

    # get the HTML content
    html = session.get(url).content

    # parse HTML using beautiful soup
    soup = bs(html, "html.parser")
    return soup

注意:如果您需要一个超时 URL 的示例,我使用 https://www.ebay.com

【问题讨论】:

  • 你可以使用-->尝试:你的代码除了:return []
  • 实际上在这种情况下不起作用!如果你使用那个装饰器,你仍然会得到一个 TimeoutError 并且没有它,函数将无限期地继续

标签: python timeout


【解决方案1】:

你可以在它周围放置另一个装饰器来处理捕获超时异常并返回一个空列表。如果您不想自己编写它,您可能需要使用来自 funcy https://funcy.readthedocs.io/en/stable/flow.html 的 @ignore。假设你得到一个 TimeoutError 异常,你应该看起来像

import timeout_decorator
import requests
from bs4 import BeautifulSoup as bs

@ignore(TimeoutError, default=[])
@timeout_decorator.timeout(5, use_signals=False)
def get_soup(url):
    session = requests.Session()
    # set the User-agent as a regular browser
    session.headers["User-Agent"] = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36"

    # get the HTML content
    html = session.get(url).content

    # parse HTML using beautiful soup
    soup = bs(html, "html.parser")
    return soup

【讨论】:

  • 这仍然只是返回一个 TimeoutError ?
  • 如果您在超时装饰器中指定 timeout_exception=TimeoutError ,看起来这很有效。我以为这是默认设置,但是?‍♂️
【解决方案2】:

忽略会是这样的:

import timeout_decorator

def ignore(func, *args, **kwargs ):
    def main( *args, **kwargs ):
        try:
            return func( *args, **kwargs )
        except TimeoutError as e:
            print( e )
            return []
    return main

@return_lister
@timeout_decorator.timeout(5)
def function_that_times_out():
    input()

function_that_times_out()

【讨论】:

  • 如果函数没有超时,此方法返回 None。它也不区分 TimeoutError 和其他类型的错误。
  • 对,对不起。将异常更改为 TimeoutError,我将对其进行编辑
猜你喜欢
  • 1970-01-01
  • 2021-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多