我正在用python编写一个模块,它有许多功能可以在各种情况下使用,导致随着时间的推移而更改默认值。(目前这是我正在导入的一个.py文件)许多函数都具有相同的硬编码默认值。我想使这些默认配置,理想的情况下,通过一些功能,可以通过一个jupyter笔记本已经导入模块,或至少可以设置在导入时或通过一个配置文件。
我知道如何使用其他语言来做到这一点,但在python中,我一直在努力做到这一点。我不希望默认值是硬编码的。我知道这方面的一些困难是模块只导入一次,这意味着在导入完成后,模块中的变量不再可访问。如果有一种方法来看这个更丙酮,我会接受一个答案,解释为什么我想要的解决方案是非pythonic和什么是一个好的替代方案。
例如,下面是函数的样子:
function1(arg1 = default_param1):
return arg1
function2(arg1 = default_param1, arg2 = default_param3):
other cool stuff以下是我想要做的类似的事情:
import foo_module.py as foo
foo.function1()
foo.default_param1 = new_value
foo.function1()
==> arg1
==> new_value当然,使用此设置,每次调用函数时都可以更改值输入,但这并不理想。
在这种情况下,如何通过导入模块的代码更改整个模块的default_param1?
编辑:为了澄清,这个模块不能通过命令行访问。一个主要的用例是将它导入到jupyter笔记本中。
发布于 2020-10-01 00:45:37
您可以使用环境变量,以便模块在导入时读取这些变量并相应地调整默认值。
您可以使用os.environ提前设置环境变量。所以,
import os
os.environ['BLAH'] = '5'
import my_module在my_module.py内部,你会发现
import os
try:
BLAH_DEFAULT = int(os.environ['BLAH'])
except:
BLAH_DEFAULT = 3如果您不想摆弄环境变量,而且在导入后默认设置是可变的,那么my_module.py可以将缺省值存储在全局dict中。例如。
defaults = {
'BLAH': 3,
'FOO': 'bar',
'BAZ': True
}您的用户可以手动更新该字典(my_module.defaults['BAZ']=False),或者,如果这让您感到困扰,您可以将该机制隐藏在一个函数中:
def update_default(key,value):
if key not in defaults:
raise ValueError('{} is not a valid default parameter.'.format(key))
defaults[key]=value您可以通过对传递的值进行类型/范围检查来突出该函数。
但是,请记住,与C++和Java等语言不同,Python中没有任何东西是真正隐藏的。用户可以直接引用my_module.defaults,从而绕过您的函数。
https://stackoverflow.com/questions/64147475
复制相似问题