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 从而绕过您的函数。