我的 django 应用程序中有一个报告生成 API,它将报告名称作为用户的输入,用户可以从下拉列表中选择不同的报告
reports = request.GET['reports'].split(',')
Run Code Online (Sandbox Code Playgroud)
例子:
print("selected reports", reports)
>>seleceted reports ['AS', 'DD', 'IS', 'LM']
Run Code Online (Sandbox Code Playgroud)
现在这reports可能会根据用户的不同而有所不同,我有一个包含创建这些报告的所有功能的字典
master = {
'AS': Summary(df, description_dict, emp),
'AH': lastSeenMissingAsset(df, emp, description_dict),
'MS': missingScans(df, emp),
'IS': individualScans(df),
'LM': tagMismatch(df, emp),
'MAS': missingAssets(df, emp, description_dict, deployed_df),
'MAU': missingAudit(df, pd.to_datetime(tt).date()),
'DD': dumpData(df)
} ###this calls every report first
Run Code Online (Sandbox Code Playgroud)
如何根据从用户那里获得的动态列表调用字典中的函数?
我试过:
final={}
print("selected reports", reports)
for i in reports:
final[i] = master[i]
print("final", final)
Run Code Online (Sandbox Code Playgroud)
这是可行的,但由于字典的原因,所有函数都会首先调用,如何使其仅调用选定的报告?
正如所有评论中所述,问题在于创建主字典时所有函数(摘要等)都会被调用一次。然后,您迭代选定的报告,从而再次调用某些函数。
解决方案确实是修改 master 并使用partial:
master = {
'AS': partial(Summary, df, description_dict, emp),
'AH': partial(lastSeenMissingAsset, df, emp, description_dict),
'MS': partial(missingScans, df, emp),
'IS': partial(individualScans, df),
'LM': partial(tagMismatch, df, emp),
'MAS': partial(missingAssets, df, emp, description_dict, deployed_df),
'MAU': partial(missingAudit, df, pd.to_datetime(tt).date()),
'DD': partial(dumpData, df)
}
Run Code Online (Sandbox Code Playgroud)
然后当你迭代 master 时:
for i in reports:
final[i] = master[i]() # notice the () --> master[i] is a Callable
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
190 次 |
| 最近记录: |