Python论坛  - 讨论区

标题:Re[9]: [python-chinese] 关于模板系统--我的一个简单实现--欢迎讨论

2004年08月25日 星期三 19:18

Zoom.Quiet zoomq at infopro.cn
Wed Aug 25 19:18:03 HKT 2004

Hollo limodou:

  哈哈哈!是也乎是也乎!!!
所以,是…………………………
列表中哪位来着??
找到了!:::
http://python.cn/pipermail/python-chinese/2004-August/004091.html

明白了Python 的哲学:
Remember, Python comes with batteries included!
  http://www.python.org/pics/batteries-included.jpg

技术开发文档,只要提纲挈领式的解说,具体的,都到代码中去看吧!
如果你,每一个类,函式名设计的足够清晰,明了,又完善的自说明文本,完全可以通过代码的阅读来真正理解的哪!

学习4Suite 过程中,基本上就是探索 .__doc__ 完成的!
其文档组织的非常精要哪!

所以 epydoc 得以代替 pydoc 快速成长!
面对作者,p2p 方式询问,现在当然好,但是以后 木头兄成为名人了,可就没有办法抓到了哪是也乎!!嗬嗬嗬………………

而且,在公司,是最主要的 coding 时间,回家,几乎没有什么时间了
而公司只能MSN, mail 连接外面!!!

还是多在Wiki 中系统的一点点儿,将 newEdit 的设计思路,简要的记录在案是也乎? 也可以作为个人的开发里程碑哪!!



/******** [2004-08-25]18:59:11 ; limodou wrote:

limodou> Zoom.Quiet,您好!

limodou> 	写技术文档要花时间呀。象
limodou> newEdit这次到2.6我又进行了大的修改,几乎每个程序都改了一下。而且某些核心的东西还经常地发生变化。好在是一个人,不用考虑别人。还有就是有些东西在脑子里,但是要写出来就不容易了,写多深,写多少,如何写,都不是件容易的事。有时间一定会写的。如果有哪些很想快点知道的,不如就用uc好了。我有时间就在网上,可以直接问我。语音聊也可以的。

limodou> ======= 2004-08-25 18:21:06 您在来信中写道:=======

>>Hollo limodou:
>>
>>  嗬嗬嗬!只要乱想,结构性的设计会变化出无限可能的是也乎…………
>>
>>不过讲到 pickle,
>>4suite 的4ODS 专门实现了 ODMG 对象数据标准(Object Data
>>Standard)v3.0(其它工具都无意实现)。除此之外,ODMG 标准使用 .odl
>>文件中的对象格式规范。如果您希望或者需要,除诸如 shelve 或 pickle
>>特别方法以外,4ODS 允许更正式的持续对象设计
>>
>>嘿嘿嘿!好象是Python 持久性对象应用的唯一实现?!?!
>>
>>可以参考一下子是也乎,
>>
>>ps.
>>进来newEdit 以迅猛的速度在升级哪!!
>>技术文档也请尽快同步上来,让同志们分享 Python 的快乐是也乎是也乎!
>>
>>/******** [2004-08-25]18:15:13 ; limodou wrote:
>>
>>limodou> Zoom.Quiet,您好!
>>
>>limodou>
>>	xslt的东西当初我为了翻译diveintopython和学习doctook是专门学过,现在已经忘得差不多了。难道是不难,但xml标记这东西看来还是太多,太乱。
>>
>>limodou>     4Suite也知道,没用起来。
>>
>>limodou>    
>>limodou>
>>meteor以后可能不会生成xml的配置文件,而更是象python一样的文件。因为,我设置的脚本也好,wizard也好都是python的程序。致于数据保存我可能先会考虑使用pickle,因为直接把一个对象保存起来很方便,以后也许会考虑做一些适配器可以转成其它的格式,如xml格式,但内部应该是越简单越直接越好。这是我的想法。不然光做配置数据的存储、分析可能就够麻烦的了。是否使用pickle关键是看数据是私有还是公开的。因为象代码片段我想象的是别人可以用编辑器进行修改,而且使用xml的确容易组织于是就使用它的。不过前提还有一个就是,它的格式是统一的。但NewEdit中的参数管理就使用了
>>limodou>
>>pickle来保存,因为数据可能是各种各样的,很复杂,我也不想在这方面浪费时间。因此要看最后模板的配置数据有多复杂,太复杂了
>>limodou> 我可能还是会使用pickle来保存。
>>
>>limodou>    
>>limodou>
>>在NewEdit中已经使用了xrc的资源文件,都是我使用xrced来生成的,然后在我的程序中进行调用。但是在程序中只调用是不行的,因为还有逻辑在其中,因此xrc只是生成窗口,处理逻辑还是要单独实现。至于在wizard中是否使用xrc可能我还在考虑。因为我看到了pycard,它也提供一上资源编辑的功能,而且格式看上去虽然不是xml的,但是感学还不错,而且关键的是,它根本就是一个python程序,就象我设计的meteor模板一样是一个python程序。等有时间我会仔细研究一下。
>>
>>limodou>    
>>limodou>
>>这样我想象中的wizard是一系列的wizard对象,这些对象是用来采集用户信息,并且以界面的方式展现,那么我可能使用xrc或pycard的格式。然后等wizard收集完所有的信息之后,再调用meteor来进行真正的模板处理。这其中wizard可能也会有一个wizard脚本的对象来控制所有wizard页面的显示与跳转。也许还会有一个简单的配置把wizard与meteor联系在一起协同工作。
>>
>>limodou>    
>>limodou>
>>这是目前的设想。等到wizard做出来的时候,NewEdit可以非常的通用了,你只要写自已的wizard和模板就可以生成想要的代码框架了。
>>
>>limodou> ======= 2004-08-25 17:35:32 您在来信中写道:=======
>>
>>>>Hollo limodou:
>>>>
>>>>  嘿嘿嘿!!!在下最擅长的就是“抛砖引玉”是也乎!
>>>>
>>>>自个儿是什么也不精,就是挑有趣的用!唯恐错过新生事物的品尝!
>>>>
>>>>不过,使用的东西越广,说明东西越成熟,越有学习的必要哪??
>>>>
>>>>4Suite 一直知道,但是没有机会使用,现在一用!发现果真好!
>>>>XSLT 也是老技术了,现在都要升级到 EXSLT 了!
>>>>使用XMLSpy 根本不用怎么学习,尝试的用一下子,马上就会是也乎??
>>>>以下是主要的模板代码:
>>>>
>>>>
>>>>				
>>>>					
>>>>					
>>>>    def pack_>>>> select="/Otter/@ProtocolName"/>p_>>>> select="@CommandName"/>(self, fields):
>>>>        """报文打包"""
>>>>        return struct.pack('>>>> select="Field">>>>> select="@FieldType"/>'
>>>>                ,fields['>>>> select="@FieldName"/>']
>>>>                )
>>>>
>>>>    def unpack_>>>> select="/Otter/@ProtocolName"/>p_>>>> select="@CommandName"/>(self, packet):
>>>>        """>>>> select="@CommandName"/>报文解包"""
>>>>	
>>>>		
>>>>        self.body.fields['>>>> select="@FieldName"/>'], \
>>>>		
>>>>        self.body.fields['>>>> select="@FieldName"/>'] = \
>>>>	
>>>>
>>>>            struct.unpack('>>>> select="Field">>>>> select="@FieldType"/>',packet)
>>>>					
>>>>					
>>>>
>>>>    def pack_>>>> select="/Otter/@ProtocolName"/>p_>>>> select="@CommandName"/>_resp(self, fields):
>>>>        """_resp报文体为空"""
>>>>        return None
>>>>
>>>>    def unpack_>>>> select="/Otter/@ProtocolName"/>p_>>>> select="@CommandName"/>_resp(self, packet):
>>>>        """_resp报文体为空"""
>>>>        pass
>>>>					
>>>>				
>>>>
>>>>
>>>>
>>>>可以看到
>>>>;;;
>>>>算子非常自然的进行了逻辑判定,嵌套循环,很形象的解析了XML的内容,
>>>>学习曲线应该不是严重的吧…………
>>>>
>>>>
>>>>/******** [2004-08-25]17:29:32 ; limodou wrote:
>>>>
>>>>limodou> Zoom.Quiet,您好!
>>>>
>>>>limodou>
>>>>	那是自然了。xslt就是专门处理xml的脚本语言。只不过,用的东西太广的话,别人就很难参与进来了。因为学习曲线可能太长了。
>>>>
>>>>limodou> ======= 2004-08-25 17:09:56 您在来信中写道:=======
>>>>
>>>>>>Hollo limodou:
>>>>>>
>>>>>>  http://wiki.woodpecker.org.cn/moin.cgi/4suite4xslt
>>>>>>
>>>>>>整理了一下子!
>>>>>>发现XML 数据源的模板解析还是XSLT最舒服!!
>>>>>>
>>>>>>
>>>>>>/******** [2004-08-25]17:09:15 ; limodou wrote:
>>>>>>
>>>>>>limodou> Zoom.Quiet,您好!
>>>>>>
>>>>>>limodou> 	有心得写成文章呀!
>>>>>>
>>>>>>limodou> ======= 2004-08-24 17:36:34 您在来信中写道:=======
>>>>>>
>>>>>>>>Hollo limodou:
>>>>>>>>
>>>>>>>>  谢谢!!
>>>>>>>>
>>>>>>>>回家好好看一看!
>>>>>>>>今天,研究了一下子 4suite 使用其 4xslt
>>>>>>>>模块,可以在脚本中进行 XSLT+XML 的解析处理,
>>>>>>>>
>>>>>>>>哈哈哈!直接使用 XSLT 进行嵌套处理非常的自然,也是XML 标准的处理方式!!!
>>>>>>>>
>>>>>>>>
>>>>>>>>/******** [2004-08-24]17:34:58 ; limodou wrote:
>>>>>>>>
>>>>>>>>limodou> python-chinese,您好!
>>>>>>>>
>>>>>>>>limodou>
>>>>>>>>我写了一个小的模板类,现在可以实现嵌套处理,但是不支持根据列表数据而实现模板的循环。
>>>>>>>>
>>>>>>>>limodou> 模板类:
>>>>>>>>
>>>>>>>>limodou> import re
>>>>>>>>limodou> import sets
>>>>>>>>limodou> import copy
>>>>>>>>
>>>>>>>>limodou> re_node = re.compile('%\((\w+)\)s')
>>>>>>>>
>>>>>>>>limodou> class Template:
>>>>>>>>limodou> 	def __init__(self):
>>>>>>>>limodou> 		pass
>>>>>>>>	
>>>>>>>>limodou> 	def load(self, tplname):
>>>>>>>>limodou> 		mod = __import__(tplname)
>>>>>>>>limodou> 		components = tplname.split('.')
>>>>>>>>limodou> 		for comp in components[1:]:
>>>>>>>>limodou> 			mod = getattr(mod, comp)
>>>>>>>>
>>>>>>>>limodou> 		self.vars = {}
>>>>>>>>limodou> 		self.nodes = {}
>>>>>>>>limodou> 		for v in dir(mod):
>>>>>>>>limodou> 			if v.startswith('__') and v.endswith('__'):
>>>>>>>>limodou> 				continue
>>>>>>>>limodou> 			self.vars[v] = getattr(mod, v)
>>>>>>>>limodou> 			self.nodes[v] =
>>>>>>>>limodou> list(sets.Set(self._get_rely_on_node(self.vars[v])))
>>>>>>>>
>>>>>>>>limodou> 	def _get_rely_on_node(self, s):	#search for
>>>>>>>>limodou> %(name)s format, make a dict
>>>>>>>>limodou> 		return re_node.findall(s)
>>>>>>>>
>>>>>>>>limodou> 	def _get_list(self, path, target):
>>>>>>>>limodou> 		if not self.vars.has_key(target):
>>>>>>>>limodou> 			return
>>>>>>>>limodou> 		if target not in path:
>>>>>>>>limodou> 			path.append(target)
>>>>>>>>limodou> 		for i in self.nodes[target]:
>>>>>>>>limodou> 			self._get_list(path, i)
>>>>>>>>limodou> 		return
>>>>>>>>
>>>>>>>>limodou> 	def value(self, target='main', values=None):
>>>>>>>>limodou> 		path = []
>>>>>>>>limodou> 		self._get_list(path, target)
>>>>>>>>limodou> 		path.reverse()
>>>>>>>>limodou> 		if not values:
>>>>>>>>limodou> 			vals = {}
>>>>>>>>limodou> 		else:
>>>>>>>>limodou> 			vals = copy.deepcopy(values)
>>>>>>>>limodou> 		for i in path:
>>>>>>>>limodou> 			vals[i] = self.vars[i] % vals
>>>>>>>>limodou> 		return vals[target]
>>>>>>>>
>>>>>>>>limodou> if __name__ == '__main__':
>>>>>>>>limodou> 	vars = dict(value='aba')
>>>>>>>>limodou> 	template = Template()
>>>>>>>>limodou> 	template.load('tmp2')
>>>>>>>>limodou> 	print template.value('main', vars)
>>>>>>>>
>>>>>>>>limodou> 测试文件:
>>>>>>>>
>>>>>>>>limodou> main="""
>>>>>>>>limodou> v = []
>>>>>>>>limodou> %(statement)s
>>>>>>>>limodou> for i in range(10):
>>>>>>>>limodou> %(printvar)s"""
>>>>>>>>
>>>>>>>>limodou> statement = "v.append('%(value)s')\n"
>>>>>>>>
>>>>>>>>limodou> printvar = "    print '\\n'.join(%(var)s)\n"
>>>>>>>>
>>>>>>>>limodou> var = 'v'
>>>>>>>>
>>>>>>>>limodou> 有兴趣的可以讨论。
>>>>>>>>
>>>>>>>>limodou>
>>>>>>>>现在的问题是对于可循环的模板,比如上面的statement我想根据提供的数据如果为列表或元组时,会自动进行重复。但一个模板可能涉及多个模板变量,如果有多个模板变量为多值该如何处理。按我
>>>>>>>>limodou>
>>>>>>>>的想法,这种多值应该组织为一个元组的列表。不过,不太清楚otter会分析出什么数据来。不知道ZoomQuiet对这个有没有兴趣。
>>>>>>>>
>>>>>>>>limodou> 简单说一下用法:
>>>>>>>>
>>>>>>>>limodou> 我定义的模板其实是一个模块,不过只是用来定义数据的。
>>>>>>>>
>>>>>>>>limodou> 	vars = dict(value='aba')  #生成模板用到的变量
>>>>>>>>limodou> 	template = Template()     #生成一个模板对象
>>>>>>>>limodou> 	template.load('tmp2')     #装入一个模板
>>>>>>>>limodou> 	print template.value('main', vars)  
>>>>>>>>limodou> #得到最终模板的值
>>>>>>>>当然,模板中还有许多的子模板,都可以得到。
>>>>>>>>limodou>         致
>>>>>>>>limodou> 礼!
>>>>>>>> 				
>>>>>>>>
>>>>>>>>limodou>         limodou
>>>>>>>>limodou>         chatme at 263.net
>>>>>>>>limodou>           2004-08-24
>>>>>>>>
>>>>>>>>
>>>>>>>>********************************************/
>>>>>>>>
>>>>>>>>-- 
>>>>>>>>Free as in Freedom
>>>>>>>>
>>>>>>>> Zoom.Quiet                           
>>>>>>>>
>>>>>>>>#=========================================#
>>>>>>>>]Time is unimportant, only life important![
>>>>>>>>#=========================================#
>>>>>>>>
>>>>>>>>sender is the Bat!2.12.00
>>>>>>>>
>>>>>>>>_______________________________________________
>>>>>>>>python-chinese list
>>>>>>>>python-chinese at lists.python.cn
>>>>>>>>http://python.cn/mailman/listinfo/python-chinese
>>>>>>>>
>>>>>>
>>>>>>limodou> = = = = = = = = = = = = = = = = = = = =
>>>>>>			
>>>>>>
>>>>>>limodou>         致
>>>>>>limodou> 礼!
>>>>>> 
>>>>>>				 
>>>>>>limodou>         limodou
>>>>>>limodou>         chatme at 263.net
>>>>>>limodou>           2004-08-24
>>>>>>
>>>>>>
>>>>>>
>>>>>>********************************************/
>>>>>>
>>>>>>-- 
>>>>>>Free as in Freedom
>>>>>>
>>>>>> Zoom.Quiet                           
>>>>>>
>>>>>>#=========================================#
>>>>>>]Time is unimportant, only life important![
>>>>>>#=========================================#
>>>>>>
>>>>>>sender is the Bat!2.12.00
>>>>>>
>>>>>>_______________________________________________
>>>>>>python-chinese list
>>>>>>python-chinese at lists.python.cn
>>>>>>http://python.cn/mailman/listinfo/python-chinese
>>>>>>
>>>>
>>>>limodou> = = = = = = = = = = = = = = = = = = = =
>>>>			
>>>>
>>>>limodou>         致
>>>>limodou> 礼!
>>>> 
>>>>				 
>>>>limodou>         limodou
>>>>limodou>         chatme at 263.net
>>>>limodou>           2004-08-25
>>>>
>>>>
>>>>
>>>>********************************************/
>>>>
>>>>-- 
>>>>Free as in Freedom
>>>>
>>>> Zoom.Quiet                           
>>>>
>>>>#=========================================#
>>>>]Time is unimportant, only life important![
>>>>#=========================================#
>>>>
>>>>sender is the Bat!2.12.00
>>>>
>>>>_______________________________________________
>>>>python-chinese list
>>>>python-chinese at lists.python.cn
>>>>http://python.cn/mailman/listinfo/python-chinese
>>>>
>>
>>limodou> = = = = = = = = = = = = = = = = = = = =
>>			
>>
>>limodou>         致
>>limodou> 礼!
>> 
>>				 
>>limodou>         limodou
>>limodou>         chatme at 263.net
>>limodou>           2004-08-25
>>
>>
>>
>>********************************************/
>>
>>-- 
>>Free as in Freedom
>>
>> Zoom.Quiet                           
>>
>>#=========================================#
>>]Time is unimportant, only life important![
>>#=========================================#
>>
>>sender is the Bat!2.12.00
>>
>>_______________________________________________
>>python-chinese list
>>python-chinese at lists.python.cn
>>http://python.cn/mailman/listinfo/python-chinese
>>

limodou> = = = = = = = = = = = = = = = = = = = =
			

limodou>         致
limodou> 礼!
 
				 
limodou>         limodou
limodou>         chatme at 263.net
limodou>           2004-08-25



********************************************/

-- 
Free as in Freedom

 Zoom.Quiet                           

#=========================================#
]Time is unimportant, only life important![
#=========================================#

sender is the Bat!2.12.00



[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2025

    京ICP备05028076号