根据用户的动态列表调用函数

Rah*_*rma 0 python django

我的 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)

这是可行的,但由于字典的原因,所有函数都会首先调用,如何使其仅调用选定的报告?

Gaë*_*tan 5

正如所有评论中所述,问题在于创建主字典时所有函数(摘要等)都会被调用一次。然后,您迭代选定的报告,从而再次调用某些函数。

解决方案确实是修改 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)