python配置库加载python配置文件

confect的Python项目详细描述



Confect-python配置库加载python配置文件

---------------------------



-**用于存储机密**


用于在运行时加载和使用它的库。

-**对于不同的运行时环境**


例如,开发环境中的数据库IP地址和密码通常不同于生产环境。
您需要多个配置文件来存储这些信息针对不同环境的格式,并在运行时加载其中一个。

-**为了更好地管理参数**


您正在运行一些实验,例如在机器学习项目中工作。
在运行时有一堆参数需要更改。
以一种更聪明、更优雅的方式来管理它们。

confect与其他糖果有何不同?
---------------------------

-**python配置文件**

这使得

+可以将复杂类型对象作为配置值,例如decimal、timedelta
或任何类实例
+动态处理复杂逻辑,您可以使用c条件语句
类似于其中的"if"。
+读取
配置文件中的其他toml/ymal/json/ini文件甚至环境变量。

-**可以通过模块导入加载配置文件**

很容易通过"pythonpath"控制配置文件的源。

-**可以多次加载配置文件**

有时我们需要多个配置文件-一个用于项目,
一个用于团队,一个用于个人。
我们希望个人配置文件具有最高优先级。
如果该文件中存在配置设置,它将覆盖其他文件中的值


-**从环境变量加载配置属性**

如果要更改单个或某些属性值,
并且不想修改配置文件。

-**将命令行选项附加到某些单击命令**

r/>
-**更好的可维护性**

并且``conf``对象是不可变的,以减少出错的可能性。




==

``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/

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
scrollView中的java磁效应   java JCreator有没有像Resharper(VS2010)这样的对象?   java Android:空指针异常(文件)   java Lucene:前缀令牌匹配或精确匹配的前缀   java打算在Android中的相机或图库中进行选择   java如何获得与Joda DateTime后端兼容的完整HTML时区选择   java如何修复安卓错误包。支持v7不存在吗?   尝试保存文件时未找到java FileNotFound   java是组织。反思。线程安全的反射   java如何在其他活动中使用字符串数组   使用Java解析JSON数据时遇到问题   在使用JCC创建Java库接口之后,如何在Python脚本中创建Java字符串对象?   sql server java。util。日期到爪哇。sql。日期不包含时间   java我们在spring3中有页面作用域吗?   从有时间限制的程序执行程序的多线程(Java)   java如何动态打印类名和它们的xpath相同?使用SeleniumWebDriver   java使用1D数组打印最长公共子序列(LCS)元素   java替换多次出现的字符   JavaFXJAR在我的机器上运行,但在其他机器上不运行   musicbrainz使用musicbrainzws2java定位各种曲目的mbid