从多个源自动加载配置、对象注册表、dpath访问。

flange的Python项目详细描述


#法兰

![Circleci](https://circleci.com/gh/flashashen/flange.svg?style=svg)
[![PYPI版本](https://badge.fury.io/py/flange.svg)(https://badge.fury.io/py/flange)
![Python版本](https://img.shields.io/pypi/pyversions/flange.svg)
![麻省理工学院许可证](https://img.shields.io/github/license/flashashen/flange.svg)



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


使用基于模型的对象注册表方便地搜索和加载配置。

*配置位可能已经在配置文件中的某个位置存在..*
``yaml

文件..
我的MSSQL数据库:
驱动程序:MSSQL+PymSQL
名称:db name
用户:dev user
过程:dev pass
主机:db host.dev.corp
端口:"1111"
描述:dev db
参数:{登录超时:6}



```

*您可以这样做。..*

```
sh>;python-c"来自flange import cfg,dbengine;result=cfg.mget('my_mssql_db').execute('use master select@@version').first()[0];cfg.mget('my_logger').debug(result)"
2018-03-09 15:49:55726:debug:myapp Microsoft SQL Server 2008(SP4)-10.0.6000.29(x64)
2014年9月3日04:11:34
版权所有(c)1988-2008 Microsoft Corporation
Windows NT 6.1上的企业版(64位)<;x64>;(构建7601:Service Pack 1)(vm)
`````

**如果**:

-您厌倦了Y中的样板配置代码我们的Python项目
-您厌倦了Python项目中的样板记录器安装程序BR/> -您厌倦了Python项目中的样板数据访问设置BR/> -您厌倦了样板*{{填写空白}}*安装在您的Python项目
-您想在Python控制台中进行黑客攻击也不记得你把配置和凭证的所有位都放在哪里了-你想把密码与主配置分开




从各种来源使用anyconfig
-可插入的,从配置数据自动检测/创建对象
-带有lazy init和cache的对象注册表
-方便的对象访问
-使用[dpath](https://github.com/akesterson/dpath-python)来匹配配置/数据中的键

部分灵感来自spring框架。在init上,主配置对象
将在给定目录中搜索给定深度的文件模式集以获取配置
数据,并将此数据合并到单个配置对象中。

此外,还提供了一个对象注册表,可以识别co中的模式。nfig data
,并根据任何类型对象的需要返回缓存实例。对象初始化是自动的和惰性的。
对实例的识别目前使用json schema
来识别模式,并提供一个python函数作为工厂函数。
factory方法可以在python中显式地指定,也可以指定为解析为python函数的url。模式和工厂函数以及名称的组合称为"模型"。


内置的logger json模式如下:

```
{
"type":"object",
"properties":{
"name":{"type":"string"},
"level":{"enum":["critical","error","warning","info","debug"]},
"format":"type":"string"},

"必需":["name","level"]
}
```


/>
```
{
..
我的日志记录器:
名称:myapp
级别:调试
格式:%(asctime)s:%(level name)s%(message)s"
}
````

给定[dpath]的obj(..)方法访问对象(https://github.com/akesterson/dpath-python)表达式如下:


```
在[1]:从flange import cfg

在[4]:cfg.obj(model='logger').debug('hello')
2018-03-09 14:43:07514:debug:myapp hello
```


或者在实例配置中使用'values'参数指定一个值:

```
或者在实例配置中使用'values'参数指定多个值:cfg.obj(values=['myapp','debug']).debug('hello')
2018-03-09 14:51:36742:debug:myapp hello
````

使用mget(..)方法的ique实例。



/>可以使用src(..)或uri(…)方法找到包含配置的文件。
第一个返回包含内容、uri和其他信息的源。
后一个简单函数返回配置/数据资源的uri在[8]:cfg.src('**/my-logger')
```
out[8]:<;source uri=/users/myname/some_config.yml root_path=none parser=yml error=none>;

in[9]:cfg.uri('**/my-logger')
out[9]:'/users/panelson/.cmd.yml'

```

*注意:所有访问方法的版本都具有返回多个值的相同参数。*
-obj、objs
-value、values
-src、srcs
-uri、uri


返回键,值对。
````
in[10]:cfg.search('**/my-logger')
out[10]:
[('vars','my-logger'),
ordereddict([('name','myapp'),
('level','debug'),
('format',
'%(asctime)s:%(levelname)s:%(name)s%(message)s'))]]```



加载的数据用info()方法进行描述。导入dbengine模块,该模块自动注册基于sqlalchemy的模型,并搜索对sqlalchemy引擎有效/足够的任何配置。注意:sqlalchemy是一个内置模型示例。任何类型的模型都可以注册。**注意,导入dbengine模块后,输出中会出现'dbengine'模型及其实例
,.*

```
in[2]:from flange import cfg


in[3]:cfg.info()


模型:
logger实例:logger

base dir:。
搜索深度:1
文件包含模式:['*.yml','*cfg','*settings','*config','*properties','*props']
文件排除模式:['*.tar','*.jar','*.zip','*.gz','*.swp','node_modules','target','.idea','*.hide','*save']

源:
无操作系统环境
外壳变量/用户s/myuser/.gitconfig
yml/users/myuser/config_example.yml
yml/users/myuser/.cmd.yml
shellvars/users/myuser/.ansible.cfg
yml/users/myuser/.flangetest.yml
shellvars/users/myuser/.bundle/config
shellvars/users/myuser/.git/config
yml/users/myuser/.nytth/config.yml
shellvars/users/myuser/.plotly/.config
shellvars/users/myuser/.screamingfrogseospider/spider.config
shellvars/users/myuser/.ssh/config
shellvars/users/myuser/.subversion/config
shellvars/users/myuser/airlow/airlow.cfg
shellvars/users/myuser/airlow/unittests.cfg
yml/users/myuser/downloads/config_example.yml
yml/users/myuser/workspace/docker compose swarm.yml

[4]:来自[5]:cfg.info()


models:
logger instances:logger

搜索深度:1
文件包含模式:['*.yml','*cfg','*settings','*config','*properties',''*props']
文件排除模式:['*.tar','*.jar','*.zip','*.gz','*.swp','node_modules','target','.idea','*.hide','*save']


源代码:
无操作环境
yml/users/myuser/config_示例.yml
yml/users/myuser/.cmd.yml
shellvars/users/myuser/.ansible.cfg
yml/users/myuser/.flangetest.yml
shellvars/users/myuser/.bundle/config
yml/users/myuser/.nytth/config.yml
shellvars/users/myuser/.plotly/.config
shellvars/users/myuser/.screamingfrogseospider/spider.config
shellvars/users/myuser/.ssh/config
shellvars/users/myuser/.subversion/config
shellvars/users/myuser/aiflow/aiflow.cfg
shellvars/users/myuser/aiflow/unittests.cfg
yml/users/myuser/downloads/config_example.yml
yml/users/myuser/workspace/docker compose swarm.yml




in[6]:cfg.obj('db1')
out[6]:引擎(mssql+pymssql://corpdomain\corpuser:**@dbhost:1111/dbname?charset=utf8)
```

import cfg
从sqlalchemy import create_engine

dbengine_schema={
"type":"object",
"properties":{
"driver":{"type":"string"},
"name":{"type":"string"},
"user":{"type":"string"},
"pass":{"type":"string"},
'端口':{'type':'string'},
},
"必需":["驱动程序","名称","用户","传递"]



def dbengine_create_func(配置):
url_format_string={:s}://{:s}:{:s}@{:s}:{:s}/{:s}?charset=utf8"
engine=create_engine(url_format_string.format(
config['driver',
config['user',
config['pass',
config['host',
config['port',
config['name',convert_unicode=true)

return engine


cfg.register_default_model(
'dbengine',
model.model('dbengine',
model.model.get_schema_validator(dbengine_schema),
dbengine_create_func))

````

上面的示例显示了来自python的显式注册。插件注册也可以通过配置来完成。下面是这个项目中
测试的一个例子。为此,python
路径中必须存在python工厂函数,该函数通过本地url*解析(请参见url格式示例)*。此配置也必须出现在法兰加载的配置数据中。有了这些警告,注册自定义模型并开始访问实例所需的全部


`````
图键':{
'类型':'法兰.类型.插件',
'架构':{
'类型':'对象',
'属性':{
'只有'u testplugin'才与'u this':{'type':'string'}
},
'必需':['只有'u testplugin'才与'u this']
},
'工厂':'python://flange.test.testplugin()。获取'u实例'
}
}
```



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

推荐PyPI第三方库


热门话题
将Java小程序转换为应用程序   音频数据格式和文件格式Java声音   java如何使用jsoup维护变量cookie和会话?   您能否使用类似于Java中python关键字args的概念来最小化访问器方法的数量?   JavaSpring引导HTTPS和重定向   如何反转直角三角形(Java)   JavaPowerMockito:拦截所有静态方法   java Vaadin TouchKit基本主题问题   java如何指定文件的路径。要在其文件系统中动态加载的类文件?   java Google Play Services Unity   java MyBatis SQL Builder类,如%   java无法访问Internet Explorer中的小程序   java如何计算2d数组中的行之间的差异?   在GridBagLayout中调用SetContraints时发生java NullPointerException   java同步锁和独立线程:Android   泛型我能让这个java pulk()方法更安全吗?   java为火车线上的所有车站创建距离地图   java在素数阶循环群中查找元素   java正在查找什么类型的类