首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可调/可配置模块

可调/可配置模块
EN

Stack Overflow用户
提问于 2020-10-01 00:18:09
回答 1查看 34关注 0票数 1

我正在用python编写一个模块,它有许多功能可以在各种情况下使用,导致随着时间的推移而更改默认值。(目前这是我正在导入的一个.py文件)许多函数都具有相同的硬编码默认值。我想使这些默认配置,理想的情况下,通过一些功能,可以通过一个jupyter笔记本已经导入模块,或至少可以设置在导入时或通过一个配置文件。

我知道如何使用其他语言来做到这一点,但在python中,我一直在努力做到这一点。我不希望默认值是硬编码的。我知道这方面的一些困难是模块只导入一次,这意味着在导入完成后,模块中的变量不再可访问。如果有一种方法来看这个更丙酮,我会接受一个答案,解释为什么我想要的解决方案是非pythonic和什么是一个好的替代方案。

例如,下面是函数的样子:

代码语言:javascript
复制
function1(arg1 = default_param1):
    return arg1
function2(arg1 = default_param1, arg2 = default_param3):
    other cool stuff

以下是我想要做的类似的事情:

代码语言:javascript
复制
import foo_module.py as foo
foo.function1()
foo.default_param1 = new_value
foo.function1()

==> arg1
==> new_value

当然,使用此设置,每次调用函数时都可以更改值输入,但这并不理想。

在这种情况下,如何通过导入模块的代码更改整个模块的default_param1?

编辑:为了澄清,这个模块不能通过命令行访问。一个主要的用例是将它导入到jupyter笔记本中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-01 00:45:37

您可以使用环境变量,以便模块在导入时读取这些变量并相应地调整默认值。

您可以使用os.environ提前设置环境变量。所以,

代码语言:javascript
复制
import os

os.environ['BLAH'] = '5'
import my_module

在my_module.py内部,你会发现

代码语言:javascript
复制
import os

try:
    BLAH_DEFAULT = int(os.environ['BLAH'])
except:
    BLAH_DEFAULT = 3

如果您不想摆弄环境变量,而且在导入后默认设置是可变的,那么my_module.py可以将缺省值存储在全局dict中。例如。

代码语言:javascript
复制
defaults = {
    'BLAH': 3,
    'FOO': 'bar',
    'BAZ': True
}

您的用户可以手动更新该字典(my_module.defaults['BAZ']=False),或者,如果这让您感到困扰,您可以将该机制隐藏在一个函数中:

代码语言:javascript
复制
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,从而绕过您的函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64147475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档