python递归修饰符

python递归修饰符,python,recursion,decorator,Python,Recursion,Decorator,我有一个函数,它从API调用返回字典列表。API最多可以返回100条记录。记录以页的形式存储,每页包含100条记录 def call_api(page): return list_of_records 我需要的是一个decorator,它可以在每次返回100条page参数为+1的记录时重新运行这个函数 比如: if len(list_of_records) == 100: call_api(page +=1) 最终的输出应该是一个包含所有记录的列表,定义递归调用函数的装饰器当

我有一个函数,它从API调用返回字典列表。API最多可以返回100条记录。记录以页的形式存储,每页包含100条记录

def call_api(page):
    return list_of_records
我需要的是一个decorator,它可以在每次返回100条page参数为+1的记录时重新运行这个函数

比如:

if len(list_of_records) == 100:
   call_api(page +=1)


最终的输出应该是一个包含所有记录的列表,定义递归调用函数的装饰器当然是可能的

在您的案例中,这样的装饰师可能是这样的:

导入工具
带_页的def(func):
@functools.wrapps(func)
def包装(第页):
记录列表=[]
部分列表=函数(第页)
记录列表。扩展(部分列表)
而len(partial_list)==100:#可能有更好的条件来检查您是否在最后一页(例如api回复中的下一页URI)
页码+=1
部分列表=函数(第页)
记录列表。扩展(部分列表)
返回记录列表
返回包装器
@附页
def调用api(第页):
#api交互在页面上创建记录列表
返回页面上的记录列表

或者,您可以调整
调用api
,以便可以递归调用它

比如:

if len(list_of_records) == 100:
   call_api(page +=1)

def call_api(第页,记录列表=[]):
部分列表=…#从api获取的记录
记录列表。扩展(部分列表)
#通常api提供下一页的url或一些更可靠的信息
#关于您是否在最后一页,即测试长度
#这样的回答可能不是最好的策略
如果len(部分列表)==100:
#时间。睡眠(0.2)#只是为了不在短时间内收到太多的请求
调用api(第+1页,记录列表)
返回记录列表

只要调用
call\u api(1)
就足以获取所有页面。

如果一个列表中有10000000条记录,您准备好重新运行函数了吗?我会限制重试次数。这个问题纯粹是理论上的。它必须是一个装饰师吗?我想这是一个包装器函数(不替换原始函数)还是一个附加的可选参数,比如
call\u api(page,max\u pages=1)
可以将它转换为装饰器吗?是的,如果你真的必须是装饰器,你可以用装饰器产生类似的行为。将添加它…同时,当前函数返回:you's right,my bad!返回不应该是有条件的-修复它。很高兴我能帮忙!