如何动态共享包范围的配置变量?
How to dynamically share a package-wide config variable?
我正在构建一个 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 那样动态更改全局配置变量,因为例如。
问题是您使用 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 包,其中有一个名为“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 那样动态更改全局配置变量,因为例如。
问题是您使用 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