Python:如何在重试函数的try-except块中正确传递关键字参数?
问题解决:KeyError: 'a' 及正确调用方式
错误原因
你调用retry(create_view(), a=1, b="x")时,会先执行create_view()这个函数调用,但此时没有给create_view传任何参数,函数内部尝试取kwargs['a']自然会抛出KeyError。而retry函数需要接收的是函数对象,不是函数执行后的结果。
修复方案
把create_view()改成create_view(去掉括号,传递函数本身),正确调用代码:
retry(create_view, a=1, b="x")
执行后就能得到期望输出:a is 1 for b as x
可选优化(增强retry函数实用性)
当前retry函数无法返回被调用函数的返回值,且最后一次失败后会静默忽略异常,可以优化如下:
import time import logging logger = logging.getLogger(__name__) def retry(function, **kwargs): max_tries = 3 for i in range(max_tries): try: logger.info(f"try# {i + 1}") logger.info(f"executing function") # 支持返回函数执行结果 result = function(**kwargs) logger.info("function executed successfully") return result except Exception as error: logger.error(f"Error Reason: {error}") if i < max_tries - 1: time.sleep(10) logger.info(f"retrying # {i + 2}") else: # 最后一次尝试失败后抛出异常,避免静默失败 logger.error(f"All {max_tries} attempts failed") raise def create_view(**kwargs) -> None: a = kwargs['a'] b = kwargs['b'] logger.info(f"a is {a} for b as {b} ") # 正确调用 retry(create_view, a=1, b="x")
内容的提问来源于stack exchange,提问作者Alankrita Mishra
相关产品推荐
相关产品推荐

