python - 如何动态共享包范围的配置变量?

标签 python configuration python-module python-packaging

我正在构建一个 python 包,其中有一个名为“config”的模块,其中我定义了不同的文件,其中包含一些在其他模块中用作配置的全局变量。

.
└── mypackage
    ├── base.py
    ├── config
    │   ├── completion.py
    │   ├── __init__.py
    │   ├── locals.py
    │   └── queries.py
    ├── encoders.py
    ├── exceptions.py
    ├── functions
    │   ├── actions.py
    │   ├── dummy.py
    │   ├── __init__.py
    │   ├── parsers.py
    │   └── seekers.py
    ├── __init__.py
    ├── query.py
    └── utils
        ├── dict.py
        ├── __init__.py
        └── retry.py

例如,文件 mypackage/config/queries.py 具有以下内容:

INCLUDE_PARENTS = False

而在主文件 mypackage/base.py 中,我有一个函数将此配置变量作为默认参数:

import mypackage.config.queries as conf

def query(include_parent_=conf.INCLUDE_PARENTS, **kwargs):
    # do stuff depending on include_parent_ argument

我想要的,以及我在其他类似问题中找不到的,是能够在 Python/Ipython 控制台 session 中动态修改这些变量。也就是说,我应该能够在 Ipython 上执行以下操作:

In [1]: import mypackage as mp

In [2]: mp.config.INCLUDE_PARENTS = True # Its default value was False

In [3]: mp.query()
Out[3]: # result with include_parent_ argument set to True

In [4]: mp.config.INCLUDE_PARENTS = False # Now I set the value back to False

In [5]: mp.query()
Out[5]: # result with include_parent_ argument set to False

但我不明白为什么我无法实现它。我尝试过将配置变量导入 init.py 及其关联的命名空间,但我从未设法能够像 Pandas 那样动态更改全局配置变量。

最佳答案

问题是您使用 conf.INCLUDE_PARENTS 作为函数的默认参数。默认参数是在创建函数时计算的,而不是在调用函数时。因此,当您稍后更改代码时,函数内的值不会更改。以下内容应该按您的预期工作。

def query(include_parent_=None, **kwargs):
    if include_parent_ is None:
        include_parent_ = conf.INCLUDE_PARENTS
    # do stuff depending on include_parent_ argument

关于python - 如何动态共享包范围的配置变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68714797/

相关文章:

Apache 和 Tomcat 代理

python - Keras:嵌入句子数组作为输入

python - 使用 'https' 与 getpage() 获取 'urlopen' 页面

python - O(n) + O(n) = O(n)?

python - Windows 在目录中找不到 scrapy 文件

java - Zookeeper 的真实使用

Mac 上不存在 eclipse.ini 文件

python - 如何在 AWS CDK 创建的 Python Lambda 函数中安装外部模块?

python - requests.get in python 给出连接超时错误

python - 为什么这不会陷入无限循环?