python实现在不同模块中共享全局变量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python实现在不同模块中共享全局变量相关的知识,希望对你有一定的参考价值。

参考技术A 定义一个py文件使用get和set方法设置和获取变量
如在gol.py中

使用时如下在gol_test1.py中:

在gol_test2.py中

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

【中文标题】如何动态共享包范围的配置变量?【英文标题】:How to dynamically share a package-wide config variable? 【发布时间】:2021-10-13 07:24:33 【问题描述】:

我正在构建一个 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 控制台会话中动态修改这些变量。也就是说,我应该能够在 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 那样动态地更改全局配置变量。

【问题讨论】:

【参考方案1】:

问题是您使用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实现在不同模块中共享全局变量的主要内容,如果未能解决你的问题,请参考以下文章

python中的多处理模块和修改共享的全局变量

Python 3 实现定义跨模块的全局变量和使用

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

python 3 基础之模块的制作导入

Python实现跨文件全局变量的方法

关于pytho面向过程开发人员三步转oo的补充,再加一步,四步走战略