Django项目中能否将函数参数默认值设为其他函数返回值
结论
你这种将函数返回值作为参数默认值的写法不是规范的Python编码方式,会存在不易排查的逻辑bug,即使当前看起来运行正常也不建议使用。
问题原因
Python的函数参数默认值的求值时机为函数定义被加载到内存的时刻,而非每次函数调用的时刻:
- 你写的
def get_report_obj(id=get_latest_id()):中,get_latest_id()只会在项目启动加载这个函数时执行1次,后续所有不传参数调用get_report_obj()的场景,都会复用第一次返回的id值,不会重新调用get_latest_id()获取最新的报告id,完全不符合你获取最新报告的业务需求。 - 你原本写的默认值设为
None,在函数内部再赋值id = get_latest_id()的写法才是规范实现,保证每次调用都会重新获取最新id。
额外注意
你两段代码里都存在变量名错误:函数参数定义的是id,但ORM查询时写的是id=report_id,report_id属于未定义变量,实际运行会抛出异常,需要修正为id=id或者给参数改名为更清晰的report_id避免歧义。
内容的提问来源于stack exchange,提问作者sarath ravi
相关产品推荐
相关产品推荐

