PChecker
灵活的参数管理系统
架构特性
同源
- 保持参数架构内数据的唯一性
class P1(Param):
name = Field()
@Field(origin="name")
def user_name(self, default_value):
return default_value
p1 = P1()
p1.name = "Acca"
p1.user_name # Acca
继承
- 提供参数的业务层面的灵活性
class P1(Param):
name = Field()
class P2(P1):
@Field(origin="name")
def user_name(self, default_value):
return default_value
p2 = P2()
p2.name = "Acca"
p2.user_name # Acca
集成
- 为大型的参数模型,提供简单性的实现模式
class P1(Param):
name = Field()
class P2(Param):
last_update = Field()
class P3(P1, P2):
@Field()
def state(self, default_value):
name = self.name
last_update = self.last_update.isoformat
return f"{name}'s docs update at {last_update}"
p1 = P3()
p1.name = "Alice"
p1.last_update = datetime.now()
p1.state # Alice's docs update at 2020-10-13T11:34:06.370998
数据分层
这里有点参考了redux的设计思维,让所有的状态更新,都保留在state
层,而stroe
层只提供基础的入参条件。
Store层
class FlaskStore(Store, Param):
@Field()
def form(self, default_value=None):
return request.form
@Field()
def cookies(self, default_value=None):
return request.cookies
因为field的机制,store层可以轻松的将任何的数据结构进行解构,并组成你想要的形式,这样对于开发人员来说,是十分友好的,因为我们可以定义自己需要的空间,而不是每次都要重新去定义一遍。另外,定义好store层,能够让参数解析的架构层和业务层有较好的分割,毕竟,store管理不算是参数管理的主要功能。
State层
flask_store = FlaskStore()
class P1(Param):
user_name = Field(origin="form.uname", store=[flask_store])
p1 = P1()
p1.user_name # will load data from request.form
state层默认嵌入在param对象中,可以说,每一个param,就是一个state层的数据实体,因为Field机制,我们可以轻松的变更param层的数据。
降级策略
参数的降级主要发生在两个主要流程中
- 参数加载流程
- 参数解析流程(特性条件下)
为了较好的支撑降级策略,特地采用了多源点
+ 多store
的策略集合,可以实现,按照源点序列或者store序列,不断的降级取值的模式。在选择优先级上,origin > store,因为origin往往体现的是用户使用时候的直接体验,应该是接近用户想法的取值续流。
class TestStore(Store, Param):
@Field
def sheet(self, default_value):
return {
"a": "123"
}
class T2Store(Store, Param):
@Field
def sheet(self, default_value):
return {
"b": "221"
}
test_store = TestStore()
test_store2 = T2Store()
class P1(Param):
a = Field(origin=["sheet.b", "c", "sheet.a"], store=[test_store, test_store2])
class P2(Param):
a = Field(origin="sheet.a", store=[test_store, test_store2])
class P3(Param):
a = Field(origin=["sheet.a", "sheet.b"], store=[test_store2])
p1 = P1()
p2 = P2()
p3 = P3()
print(p1.a, p2.a, p3.a) # 221 123 221
高级教程
- default_store
Add store in param level
class StoreB(Store, Param):
@Field
def args(self, default_value):
return {
"a": 1
}
store_b = StoreB()
class ParamA(Param):
default_store = store_b
a = Field("args.a")
- parameter check
class ParamA(Param):
a: str = Field()
b: int = Field()
- Destory Field
class ParamA(Param):
a: str = Field()
b: str = Field()
class ParamB(ParamA):
a: Destory