Tuneables/Configurable 一个模块
Tuneables/Configurable for a module
我正在 python 中编写一个模块,其中包含许多可在各种情况下使用的函数,因此会随着时间的推移而更改默认值。 (目前这是我正在导入的 .py 文件)许多函数都具有相同的硬编码默认值。我想让这些默认设置可配置,最好是通过一些功能,这些功能可以通过已经导入模块的 jupyter notebook 访问,或者至少可以在导入时或通过配置文件进行设置。
我知道如何使用其他语言来做到这一点,但一直在努力在 python 中做到这一点。我不希望默认值被硬编码。我知道这样做的一些困难是模块只导入一次,这意味着导入完成后模块内的变量不再可访问。如果有办法更 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 notebook。
您可以使用环境变量,这样,在导入时,您的模块会读取这些变量并相应地调整默认值。
您可以使用 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
如果您不想 fiddle 使用环境变量并且您同意默认值在导入后可变,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
您可以通过 type/range 检查传递的值来完善该函数。
但是,请记住,与 C++ 和 Java 等语言不同,Python 中没有任何东西是真正隐藏的。用户将能够直接引用 my_module.defaults
从而绕过您的函数。
我正在 python 中编写一个模块,其中包含许多可在各种情况下使用的函数,因此会随着时间的推移而更改默认值。 (目前这是我正在导入的 .py 文件)许多函数都具有相同的硬编码默认值。我想让这些默认设置可配置,最好是通过一些功能,这些功能可以通过已经导入模块的 jupyter notebook 访问,或者至少可以在导入时或通过配置文件进行设置。
我知道如何使用其他语言来做到这一点,但一直在努力在 python 中做到这一点。我不希望默认值被硬编码。我知道这样做的一些困难是模块只导入一次,这意味着导入完成后模块内的变量不再可访问。如果有办法更 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 notebook。
您可以使用环境变量,这样,在导入时,您的模块会读取这些变量并相应地调整默认值。
您可以使用 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
如果您不想 fiddle 使用环境变量并且您同意默认值在导入后可变,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
您可以通过 type/range 检查传递的值来完善该函数。
但是,请记住,与 C++ 和 Java 等语言不同,Python 中没有任何东西是真正隐藏的。用户将能够直接引用 my_module.defaults
从而绕过您的函数。