python配置库加载python配置文件
confect的Python项目详细描述
Confect-python配置库加载python配置文件
---------------------------
-**用于存储机密**
用于在运行时加载和使用它的库。
-**对于不同的运行时环境**
例如,开发环境中的数据库IP地址和密码通常不同于生产环境。
您需要多个配置文件来存储这些信息针对不同环境的格式,并在运行时加载其中一个。
-**为了更好地管理参数**
您正在运行一些实验,例如在机器学习项目中工作。
在运行时有一堆参数需要更改。
以一种更聪明、更优雅的方式来管理它们。
confect与其他糖果有何不同?
---------------------------
-**python配置文件**
这使得
+可以将复杂类型对象作为配置值,例如decimal、timedelta
或任何类实例
+动态处理复杂逻辑,您可以使用c条件语句
类似于其中的"if"。
+读取
配置文件中的其他toml/ymal/json/ini文件甚至环境变量。
-**可以通过模块导入加载配置文件**
-**可以多次加载配置文件**
有时我们需要多个配置文件-一个用于项目,
一个用于团队,一个用于个人。
我们希望个人配置文件具有最高优先级。
如果该文件中存在配置设置,它将覆盖其他文件中的值
。
-**从环境变量加载配置属性**
如果要更改单个或某些属性值,
并且不想修改配置文件。
-**将命令行选项附加到某些单击命令**
r/>
-**更好的可维护性**
``confect``是一个python包托管在pypi上,仅适用于python 3.6版本。
与其他python包一样,通过pip将其安装到virtualenv中,或者使用poetry来管理项目依赖项和virtualenv。
。代码::console
$pip install confect
基本用法
===
initialize conf object
----
kage name.
将以下行放入"proj_x/core.py"中。
代码::python
import confect
conf=confect.conf()
前缀'proj_x`
conf.load_envvars('proj_x')
任何其他模块代码::python
from proj_x.core import conf
可以创建多个"conf"对象,但通常不需要。在大多数情况下,在
包的一个模块中只初始化一个"conf"对象,然后导入并在应用程序中的任何位置使用它。
使用"pythonpath"环境变量来控制配置文件的源。
代码::console
$vi proj_x_conf.py
$export pythonpath=.
$python您的_应用程序。py
>声明配置组和属性
----------
**使用配置属性之前,应声明配置属性。**
使代码更具可读性和可维护性。
组名应该是有效的属性名。
通常,组名是类名、模块名或子包名。
``项目x/db.py``或``项目x/api.py``.
代码::python
conf.declare_group('api')为cg:`cg'表示conf_group
cg.cache_expire=60*60*24
cg.cache_prefix='proj_x_cache'
cg.url_base_path='api/v2/'
conf.declare_group('db')为cg:
cg.db_name='proj_x'
cg.username='proj_x_admin'
cg.password='your_password'
cg.host='127.0.0.1'
确保声明位于访问这些
属性的所有行之前。否则,将引发异常。
所有属性的默认值应与配置
声明一起定义。它不必是一个可操作的值(例如假密钥或
密码),真正可操作的值可以在配置文件中定义。
但是,即使它不是一个可操作的值,模拟默认值仍然使
声明和代码更具可读性和可维护性。
访问配置声明组和属性后,可以通过从"conf"对象获取属性(如"conf.group.prop.name``)"访问它们。代码::python
proj_x.core import conf
@routes(conf.api.url_base_path+'add')
@redis_cache(key=conf.api.cache_prefix,expire=conf.api.cache_expire)
def add(a,b)
return a+b
``proj_x/db.py`
代码::python
from proj_x.core import conf
engine=create_x engine(
f'mysql://{conf.db.username}:{conf.db.password}
f'@{conf.db.host}/{conf.db.db_x name}')
**配置属性和组是不可变的。**它们只能是全局的
通过加载配置文件更改。否则,它们始终是默认值。
>;>;conf.api.cache_expire=60*60*3
回溯(最后一次调用):
…
confect.error.frozenconfproperror:配置属性被冻结。
加载配置文件在python中。这使得您的配置文件
可编程且不受限制,如我们在"Confect与其他配置文件有何不同"一节中所述?`.
在
配置文件中定义所有配置属性是不必要的,也是不常见的。*仅将要覆盖的配置属性和相应的
值放入配置文件中。*
将其上的所有属性设为
,就好像"c"是conf对象一样。下面是配置文件的示例。
…代码::python
secret.json')作为f:
db secret=json.load(f)
c.db.username=db secret['username']
c.db.password=db secret['password']
您可以将任何配置组中的任何属性设置到"c"对象上。
但是,**只有在声明为in源代码中带有**
``conf.declare_group(group_name)``.
`c``对象仅在加载python配置文件时退出,不可能在源代码中导入它。
`` decorator将所有声明的配置附加到一个click\br/>命令。
``proj\u x/cli.py``
……
代码::python
import click
from proj_x.core import conf
@click.command()
@conf.click_x.click选项
def cli():
click.echo(f'cache_u expire={conf.api.cache_x expire}')
创建包含所有属性和默认值的全面帮助消息。
…代码::console
$python-m proj_x.cli--help
用法:cli.py[选项]
选项:
--api-cache_expire integer[默认值:86400]
--api-cache_前缀文本[默认值:proj_x_缓存]
--api-url_基路径文本[默认值:api/v2/]
--db-db_naME文本[默认:proj_x]
--数据库用户名文本[默认:proj_x_管理]
--数据库密码文本[默认:您的密码]
--数据库主机文本[默认:127.0.0.1]
--帮助显示此消息并退出。
选项确实会更改配置属性的值。
…代码::console
$python-m proj_x.cli
cache_expire=86400
$python-m proj_x.cli--api-cache_expire 33
cache_expire=33
组是不可变的。更改它的标准方法是从文件或环境变量加载配置。
布尔。无论加载语句位于组/属性声明之前或之后,
配置文件中的属性值始终覆盖默认值。可以多次加载
配置,后者将替换以前加载的值。
请注意,*您应该在加载
配置文件后访问配置属性。*否则,可能会得到错误的/默认值。因此,我们通常在创建conf对象语句之后加载配置文件。
动态选择和加载配置。
…代码::python
import sys
import confect
conf=confect.conf()
filenotfounderror:
logger.warning('找不到团队配置文件')
尝试:
conf.load_conf_file('path/to/personal_conf.py')
filenotfounderror:
logger.info('unable to find personal configuration file')
除了importerror:
logger.warning('无法加载查找配置模块%r',
'proj_x_conf')
使用环境变量覆盖配置
conf.load_envvars('proj_x')
--——
``conf.load廑envvars(prefix:str)``自动以`<;prefix>;group>;prop>;``格式搜索环境变量。这三个标识符都区分大小写。如果您有一个配置属性"conf.cache.expire_time"并且
,那么您可以调用"conf.load_envvars('proj_x')`"。它将把"expire\u time"属性设置为"proj\u x\u cache\u expire\u time"环境变量的解析值。
("proj\u x’’’doctest:+skip
地址:`` ```````datetime.datetime.datetime.datetime``````````钟摆.解析(s)方法``````````datetime.datetime.datetime.date ```````钟摆.解析(s)方法.日期()```````
````````十进制.十进制(s)方法```````br/>``````````json.load(s)加载(s)方法``````````````````json.load```````````````````````````````````````````/>可变环境
----
``conf.mutate_locally()``上下文管理器创建一个环境,使
``conf``对象暂时可变。当
离开块时,所有更改都将恢复。它用于在python repl中编写测试用例或测试配置
属性
>
>;>;conf=conf()
>;>;conf.declare嫒group(嫒declare group through keyword arguments
…'假',
…prop1=3,
…prop2='some string')
…
>;>with conf.mutate_locally():
…conf.dummy.prop1=5
…打印(conf.dummy.prop1)
5
…调用一些函数使用这个属性打印所有配置还原到DOS<;https://docs.python.org/3/library/argparse.html>;``添加用于更改配置属性的命令行选项。
-在``conf.mutate_locally()``中复制写机制,以获得更好的性能和内存使用。
-api参考页
_点击:http://click.pocoo.org/
。_ PIP:https://pip.pypa.io/en/stable/
。_ virtualenv:https://hynek.me/articles/virtualenv lives/
。_诗歌:https://poetry.eustace.io/