Python使用@装饰器语法无法得到预期结果该如何解决
问题根因
你代码报错的核心原因是:装饰器内部的wrapper函数已经生成了campaigns_outgoing数据集,但调用被装饰函数时没有把这个数据集作为参数传入,而你定义的dec_test要求必须传入campaigns_outgoing参数,最终触发参数缺失的报错。
修复方案
只需要修改wrapper函数内调用被装饰函数的逻辑,把内部生成的数据集主动传入即可,修改后和你最初手动传参的效果完全一致,修改后的完整代码如下:
import pandas as pd def prepare_todays_campaigns(decorated): def wrapper(*args, **kwargs): # creatives x campaign campaigns_outgoing = pd.DataFrame({"test":[1,2,3]}) n_campaigns = len(campaigns_outgoing) if n_campaigns > 0: print(f"{n_campaigns} to process.") # 新增传入内部生成的campaigns_outgoing参数 decorated(campaigns_outgoing, *args, **kwargs) return wrapper @prepare_todays_campaigns def dec_test(campaigns_outgoing): for _, row in campaigns_outgoing.iterrows(): print(row) dec_test()
如果后续你需要给dec_test传其他自定义参数,直接在调用dec_test()时传入即可,参数会通过*args、**kwargs正常传递给被装饰函数,不会影响现有逻辑。
内容的提问来源于stack exchange,提问作者Sam Comber
相关产品推荐
相关产品推荐

