如何从主文件覆盖导入模块中的常量并在其函数中使用?
问题原因
Python中函数的默认参数是在函数定义时就确定并绑定值的,而非调用时动态获取。你在test_import.py里定义my_func(var=MY_CONST)的时候,var的默认值就已经固定为当时的MY_CONST=1了,之后在主文件修改test_import.MY_CONST,并不会改变这个已经绑定好的默认参数值。
解决方案
方案1:函数内部动态获取常量值
修改模块中的函数,将默认参数设为None,在函数内部引用模块的常量,这样每次调用函数时都会取当前的常量值:
test_import.py修改为:
MY_CONST = 1 def my_func(var=None): # 未传参时,使用当前模块的MY_CONST if var is None: var = MY_CONST print(var)
主文件main.py保持原有修改逻辑:
import test_import test_import.MY_CONST = 3 test_import.my_func() # 输出3
方案2:用类封装常量
把常量放在类中,函数内部引用类属性,修改类属性即可同步生效:
test_import.py修改为:
class AppConfig: MY_CONST = 1 def my_func(var=None): if var is None: var = AppConfig.MY_CONST print(var)
主文件main.py:
import test_import test_import.AppConfig.MY_CONST = 3 test_import.my_func() # 输出3
方案3:修改函数的默认参数属性(不推荐)
如果不想修改模块里的函数代码,可以直接操作函数的__defaults__内部属性,替换默认参数的值:
main.py修改为:
import test_import test_import.MY_CONST = 3 # 函数的默认参数存储在__defaults__元组中,替换第一个元素 test_import.my_func.__defaults__ = (test_import.MY_CONST,) test_import.my_func() # 输出3
注意:这种方式属于操作Python内部机制,不同版本可能存在兼容性问题,日常开发不建议使用。
内容的提问来源于stack exchange,提问作者horace_vr
相关产品推荐
相关产品推荐

