信息侦察机

garlicconfig的Python项目详细描述


CircleCIcodecov

垃圾配置

<> GarlicConfig是一个框架,它可以以简单而灵活的方式处理配置。这个包的核心是用C++编写的,这个Python程序包封装了本地代码,提供了对配置的简单访问和上面的一些额外的功能。本机库允许快速检索可在任何平台上使用的配置,但此包装器允许定义高级验证和配置检索逻辑。例如,您可以定义自己的约定来获取configs的本地化版本。

整个过程从使用模型定义配置的结构开始。

您可以通过继承ConfigModel

来定义模型
fromgarlicconfigimportmodelsclassDatabaseConfig(models.ConfigModel):pass

通过添加属性(或属性),您可以定义此模型识别的内容以及每个属性应具有的格式。

对于属性,可以使用ConfigField。有一组内置字段:

  • 字符串字段
  • 整数域
  • 数组字段
  • 模型字段
  • 布尔字段

您还可以自定义ConfigModel和/或ConfigField

例如:

fromgarlicconfigimportfieldsfromgarlicconfig.exceptionsimportValidationErrorclassEvenIntegerField(IntegerField):defvalidate(self,value):ifvalue%2!=0:raiseValidationError('bad integer')defto_model_value(self,value):returnint(value)defto_garlic_value(self,value):returnstr(value)

上面的字段类将str存储在python字典表示中。但是,对于物化配置模型,使用int。它还通过提高ValidationError使不可接受的值失效,在本例中是奇数值。

注意to_model_value负责将基本类型转换为更复杂的python类型,可能是构造python定义的类。

to_garlic_value正好相反,它应该将值转换为基本值。基本值定义为以下类型之一:

  • str
  • int
  • float
  • dict
  • set&;list

这主要是为了便于编码/解码。默认情况下,这两个方法都返回给定的value而不做任何更改,我建议不要创建非常复杂的对象,因为如果需要支持它们,它将限制它们在不同平台上的可访问性。

接下来,您可以定义自己的配置模型并使用我们刚刚创建的自定义ConfigField

例如:

classSomeRandomConfig(ConfigModel):value=EvenIntegerField(nullable=False,default=2)

您可以在配置模型上使用py_value方法来获取包含基本值类型的python字典。这可以方便地将其缓存在内存中,或用于序列化。

from_dict将从python字典创建一个新的配置模型。

此外,可以使用garlic_value从当前配置模型构造GarlicValue,并使用from_garlicGarlicValue构造模型。

GarlicValue是一种将配置对象保存在本机代码中并以python惰性方式加载它们的类型。这允许您在加速所有操作的同时降低内存使用率。它还提供了一组方便的方法:

解决

允许通过提供点分隔路径请求特定值。

例如:

classParentConfig(models.ConfigModel):random_config_field=models.ModelField(SomeRandomConfig)foo=ParentConfig()foo.random_config_field.value=8garlic_value=foo.garlic_value()print(garlic_value.resolve('random_config_field.value'))

在上面的代码中,如果存在给定路径的值,则返回值的Python表示。否则,返回None。这很有帮助,因为您可以简单地给出最终值的路径并获取请求的值。因为所有这些都发生在本机代码中,所以在python字典或常规模型上使用GarlicValue要快得多。

您的目标应该是使用ConfigModel验证模型,并使用GarlicValue存储/读取配置。

克隆

复制操作,特别是python中的深度复制非常昂贵。但是,您可以使用本机克隆来更快地克隆GarlicValue实例,该克隆不需要使用深度复制就可以复制对象,并且可以完成相同的结果。

例如:

garlic_value_1=foo.garlic_value()garlic_value_2=foo.clone()

序列化

您可以使用以下代码对配置进行编码/解码。默认编码器是json。但是,您可以编写自己的编码器,并根据需要支持其他格式。

fromgarlicconfigimportencodingconfig=DatabaseConfig()serialized_string=encoding.encode(config,pretty=True)

合并层

合并两个配置层以支持继承。如果您计划使用本地化或多层配置,这将非常方便。

任何GarlicValue实例都将有一个apply方法,该方法基本上会在其自身之上应用第二个GarlicValue

例如:

fromgarlicconfigimportmodelsfromgarlicconfigimportfieldsclassExtraConfig(models.ConfigModel):has_id=fields.BooleanField(default=False)has_degree=fields.BooleanField(default=False)classDumbConfig(models.ConfigModel):name=fields.StringField(nullable=False)numbers=fields.ArrayField(IntegerField())extra=models.ModelField(ExtraConfig)defvalidate(self):super(DumbConfig,self).validate()ifnotself.nameandnotself.numbers:raisegarlicconfig.exceptions.ValidationError('invalid config for some reason!')config_1=DumbConfig.from_dict({'name':'Peyman','numbers':[1,2,3]'extra':{'has_id':True}}).garlic_value()config_2=DumbConfig.from_dict({'name':'Patrick','numbers':[4,5,6]'extra':{'has_degree':True}}).garlic_value()config_1.apply(config_2)config_1.resolve('numbers')# returns [4, 5, 6]config_1.resolve('name')# returns 'Patrick'config_1.resolve('extra.has_id')# returns True (from config_1)config_1.resolve('extra.has_degree')# returns True (from config_2)

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

推荐PyPI第三方库


热门话题
分离实体上的java JPA merge()在其存在时进行插入   java Android Javamail自定义身份验证   java如何找出EAR包中执行的第一个文件   sockets Java:如何重用SocketChannel   java通过MQTT和ssl连接安卓设备   java如何修复控制台中的“未知命令”错误?   java为多线程FizzBuzz编写测试用例   java解析findBy中的嵌套对象属性   异常Java:在这种特殊情况下,如何处理ConcurrentModificationException?   从java教科书中绘制图形   java找不到类型为com的响应对象的MessageBodyWriter。太阳运动衫应用程序编程接口。json。JSONWithPadding媒体类型:application/xjavascript   java如何在Android中将光标设置在tableLayout的行/列中所需的位置   Elasticsearch:java。lang.IllegalArgumentException:在docker容器上运行时不允许自我抑制   如何在Java中继承此方法?   java为什么我的消息消费者不接收所有其他消息?   java为什么@ApplicationScoped bean在CDI扩展的关闭前阶段有一个新实例?