详解 repoze.bfg traversal

本文深入探讨了BFG网站Traversal的概念,包括getitem方法、__parent__,__name__属性的作用,以及如何在Traversal模式下操作modelgraph。通过具体代码示例展示了如何利用Traversal进行对象的增加与操作,并解释了Exception的处理、使用ModelInterfaces和接口的重要性。文章最后介绍了如何通过接口和模型接口实现更灵活的数据模型管理。

Traversal

__getitem__

Traversal就是在一个hierarchy对象树上行走. 这个对象树叫做 model graph. Model Graph由容器节点和叶节点构成. 容器和叶只有一个区别, 那就是容器节点有getitem 方法, 而叶节点没有. 另外一个重要规则是, 容器节点被期待返回子节点或者raise一个KeyError. 这个exception非常重要, 因为当BFG在路径未穷尽时终止了行走(Terminated by KeyError), 路径的最后一截将被当作view name 而这正是我们需要的行为. 举例: 试想一个容器UserFolder他的getitem是返回folder里面的对象, 有方法getitem (self,id) 这时的请求路径为 /userfolder/id(1,2,3….) . 而为了在UserFolder上加item, 通常的路径写法是/userfolder/adduser, 这时getitem传入的是"adduser"这个串, 如果id是个int, 那么在这里的raise KeyError就自然的终止了行走, adduser就被当作view name, 我们的本意也是想调用这个view callable, 而userfolder是adduser要处理的context. 一切符合自然.


 
__parent__, __name__

在traversal模式下, 任何model graph中的节点对象都要有__parent__, __name__属性, BFG称这种对象为location-aware. 对于根节点, __parent__=__name__=None

这两个属性不必定义在构造器中, 可以在view callable中处理增加对象时刻对新对象赋予属性, 比如下面的增加wiki页面代码:


 
有Exception吗?

没有, 虽然在BFGSite的源代码中子对象看起来都没有name和parent属性, 根据作者的邮件回复, BFGSite是继承repoze.folder.Folder来的, 而这个父类在__setitem__的方法中设置了这两个属性, 所以子类就没有再手动赋值了. 同时作者指出, 如果不赋值, 那么代码中用到 repoze.bfg.url.model_url方法的都会失败.

Using Model Interfaces

先看一个典型的view 指示符:


 



它在说这么一句话, 如果Traversal 完成时, 有如下的结果:
view name: hello.html (见第一段的Traversal描述)
context: Hello的实例
相应的view callable就是views.py中的hello_world(函数或类带__call__).

这段application registry代码将某个数据模型类(model class)Hello和处理代码(hello_world)联系起来. 我们用view callable 来处理这个数据. 关键点在于这个类级别的数据模型. 如果数据模型是一个类级别的东西, 那么view callable 和他之间还是带有紧耦合的味道. 如果我们今后在数据模型上有变动, 就不太灵活. 根据实际情况的复杂度, 你可以使用模型接口model interface来和view callable组合. 好处是一个model interface 可以对应不同的类, 只要他们宣称实现了接口.

(原文: Any time a model that is determined to be the context provides this interface (IHello ), and a view named hello.html is looked up against it as per the URL, the .views.hello_world view will be invoked.)

原理

实现接口的model instance


 

这个model由两样东西组成: BlogEntry类定义了model构造器, 和一个interface attached 到这个类上. 注意用词: attach, 这里Interface被看成一个副标题, 起到tag模型的作用. 他给此模型打上了IBlogEntry的标签. (和Blog用tag来快速分类一样).

计及风电并网运行的微电网及集群电动汽车综合需求侧响应的优化调度策略研究(Matlab代码实现)内容概要:本文研究了计及风电并网运行的微电网及集群电动汽车综合需求侧响应的优化调度策略,并提供了基于Matlab的代码实现。研究聚焦于在高渗透率可再生能源接入背景下,如何协调微电网内部分布式电源、储能系统与大规模电动汽车充电负荷之间的互动关系,通过引入需求侧响应机制,建立多目标优化调度模型,实现系统运行成本最小化、可再生能源消纳最大化以及电网负荷曲线的削峰填谷。文中详细阐述了风电出力不确定性处理、电动汽车集群充放电行为建模、电价型与激励型需求响应机制设计以及优化求解算法的应用。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及从事新能源、微电网、电动汽车等领域技术研发的工程师。; 使用场景及目标:①用于复现相关硕士论文研究成果,深入理解含高比例风电的微电网优化调度建模方法;②为开展电动汽车参与电网互动(V2G)、需求侧响应等课题提供仿真平台和技术参考;③适用于电力系统优化、能源互联网、综合能源系统等相关领域的教学与科研项目开发。; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注模型构建逻辑与算法实现细节,同时可参考文档中提及的其他相关案例(如储能优化、负荷预测等),以拓宽研究视野并促进交叉创新。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值