2005年01月21日
学习资料来自于ring翻译的python cook book.源贴于linuxforum ,此处只是记录我自己的一点理解


 

使用临时变量交换值

a , b, c = b,
c, a

利用tuple的的打包和解包来实现

 

不用过多引用来构造一个字典

利用 **kwargs 实现。

def mkdict (
**kwargs ):

    return kwargs

调用范例  di=mkdict ( a=1,b=2,c=3
)    di= {‘a’:1,’b’:2,’c’:3}

*args 是采用列表传值调用的方法

a=[1,2,5,6]

def pa (*args
):

    for arg in args:

        print arg

pa (*a )

1 2 5 6

使用列表逐个传值必须前面加上* 否则只会将list当作一个值看待

pa ( a )

[1,2,5,6]

Tips: * 调用时必须在最后出现,但当* ** 同时在函数中定义时,* 要在 **的前面

def dodict(
*args,**kwargs ):

    print args

    print kwargs

调用时
列表要在最后,python规定的

dodict(a=1,b=2,*[2,3,4])

(1,2,3,4)

{‘a’:1,’b’:2}

普通参数也不能放在*arg参数之后,这也是错的:

test(*data.items(),yellow,green)

必须 test(yellow,green,*data.items())

 

从字典中获取一个值

利用get

dict={‘a’:1,’b’:3}

dict.get (‘a’,’nothing’)

1

dict.get (‘n’,’nothing’)

nothing

有这个键则返回键值,否则返回后面指定的内容,如果内容不指定返回None。利用get无需使用try . 或者has_key之类的判断

 

增加一个入口到字典

有门就用原则!setdefault

dict.setdefault
( ‘f’,5 )
如果有这个键就不做改动,如果没有就设置f=>5

dict.setdefault
( ‘f’,5 )
是有返回值的,返回时相当于get ,所以可以直接利用返回进行操作。

dict.setdefault
(‘f’,[] ).append(10) #
如果有f ,则在其值列表中增加10,没有建空列表

dict.setdefault
(‘f’,{} )[‘test’]=100 #
ff,在其值字典中加入test=>100,没有建空字典

 

 

basic.LineReceive
LineOnlyReceive不支持Raw格式,只能用于纯文本接受)中,文本接受使用 LineReceived
( self, data ) Raw
接受使用 rawDataReceived ( self, data )

两种格式之间转换使用
setRawMode ( self ) 
setLineMode ( self, extra = ‘ ‘)

Extra 用途为如果是在一个rawDataReceived中进行切换,系统将用etrax中的字符串替代rawdata 然后交给lineReceived

 

utils 中的 getProcessOutput (执行外部程序并获得其输出) 只能用于POSIX环境中

 

defer.succeed 返回一个defer 对象。 Twisted.web.client.getPage(获取网页内容)返回值也是defer对象,并不直接是内容,需要使用 addCallback
addErrorback
来完成内容的处理。

 

reactor.callLater ( time, functionname ) 可以使用如下方式cancle

self.call = reactor.callLater (30,
self._dosomething)

self.call.cancle ( )

reactor中也有一个cancle callLater的方法,不过需要callid ( 如何获得?)

 

resource => 相当于web page

Class MotdResource ( resource.Resource ):

getChild
(self, path, request )    #
相应页面获取的事件。

   
Return static.Data ( text , ‘text/HTML’ ) #
返回静态页面

 

IRC irc.IRCClient

事件 privmsg (
self, user, channel, msg)
收到消息时产生

User 呼叫方的用户名 channel 被呼叫的用户名 msg 内容

 

作为client
reactor
使用
connectTCP( host, port, factory, timeout, bindAddress )
进行连接

 

2005年01月19日

这些天在看Twisted。
  初期尽管知道其被称为framework,不过自己还是简单的以为twisted可能不过就是一个python下的网络工具库,类似win32下的powertcp之类的东东,为开发网络程序提供便利。但随着学习的不断深入,越发感觉到twisted确实非等闲之辈。其已经可以对你的编程习惯、甚至思想产生很大的转变。
  这些天再泛泛的看看,然后打算细致的研究一下。
  呵呵,越看越有趣!过些天我也学习一下limodou,来个twisted学习笔记。

  题外话:昨天安装redhat中途退出,发现redhat的安装程序是python写的。gimp中目前也可以使用python做scripts。如此可看出python在国外的流行程度。

2005年01月15日


  otter作为一个模版转换和组织的工具已经能够胜任了。通过使用4suite,otter可以很轻松的将用户定义好的xml按照模版的要求生成相应的代码。通过几天的学习,我感觉到在目前的otter使用中,占最关键地位的其实是模版的编制(其实就是程序编制)。按照otter开发的初衷,其目的是生成用于twisted架构下的程序代码,而且其提供的模版例子也都是如此,因此我们有必要对twisted做一个初步了解,这样才能够好的了解其模版的开发过程。
  Twisted 是由Twisted Matrix Laboratories开发的一套事件驱动的网络架构。他提供了非常丰富的网络协议以及独特的开发体验。
  由于其是由事件驱动,所以使用twisted作网络程序个人感觉在事件响应方面很类似.net下的经验,坐等系统的调用,而开发者无需关心更多的细节(当然并非你不能控制细节)。
  twisted的开发通常需要先定义一个Protocol(通过继承twisted已有的大量基础或高级协议),然后通过建立reactor 或者 factory 开始一个event  loop ,用户通过重载例如connectionMade  dataReceived 这一类的方法来完成自己的处理。twisted不仅仅只是提供了网络输入输出之类的能力,同时提供了很多有趣的调用方式,比如deffer 、calllater 之类的对象或方法。
  我并不想在这里对twisted更详细的介绍 ,主要是在研究otter的模版中实际碰到了twisted的应用,所以才信口开河了几句。
  下面是我在模版学习中学到的一点对自己有特别价值的东东,记下来,以便日后查询:

1、  Struct

生成cstruct,,完成二进制流数据的生成、解析。

struct.pack(“I”,value)

通过格式字符串制定将要转换的格式

2、  Getattr

很有趣的调用方式,完成command相对应方法的自动调用。

例如

method = getattr(self , “on_minimicp_%s” %
message.msgname, None)

return method(message)

python 编程金典》上还有另外一种方式也可以实现同样的功能,不过感觉起来getattr更方便

Methods=[deldata , insertdata , updatedata]

Methods[choice](data)  
#invoke method function

3、  Killzero

def killzero(self, value):

   if(isinstance(value,
str)):

       index =
value.find(‘\0′)

       if index
> -1:

           return value[:index]

   else:

       if(isinstance(value,
list)):

           length = value.__len__()

           i = 0

           while i < length:

               for each in value[i].keys():

                   value[i][each] =
self.killzero(value[i][each])

               i += 1

   return value

 

def conversionString(self):

   “”"去除fileds中字符串中的\x00″”"

   for field in
self.fields.keys():

   self.fields[field]
= self.killzero(self.fields[field])

 


   ps: 当前otter提供的模版将head的处理直接写在基类里,并没有根据xml中的定义动态处理(不是otter不能,只是目前就是这样处理的)。


2005年01月12日


  粗略的分析了一下otter里的几个程序,发现说是一个结果,实际上里面隐藏了好几种解法(wiki上倒也有点介绍,不过时代有点久远,我这种外人刚看时有点昏)。直接使用的话目前应用的是zoomq通过xslt实现的方案。

>>Python Otter.py
–i
xml文件 –o 输出目录



  otter目录中有好多个小程序,刚开始有些摸不着头脑,其实只要顺着看下来发现,绝大多数都是用作辅助用途的。比如OtCUI.py 是用来处理命令行参数的,OTFiler.py 是用来copy,确认覆盖文件的,otxml.py用来检验源xml文件以及为判断是否为长连接提供值的(呵呵,有点大材小用)。总之。真正真正的主角是下面这句:

self.code =
templeter.parse(self.xmlcnt,res.read())

  实际功能就是通过xslt,把xml中的数据表述出来。
  道理其实就这么简单。但真正想用好其实并没那么容易。协议描述的xml文件的定义目前来说并不困难,otter在这方面已经做了很充分的考虑,其实所有的难点,或者说精华都在几个xslt文件里。
看到现在,我自己才发现otter前面的程序(当然不能说没用)只不过是为使用后面的最终模版服务的,而otter所生成的程序代码的原始素材  其实均在xslt文件中。
  研究otter并非不对,但真正的重点应该放在模版的建立上。
  本人之前对xslt的应用几乎一无所知,刚才感觉恶补了一下,对照otter中提供的xslt文件,大概对zoomq的模版实现有了一定的了解。
  呵呵,下面的任务就是分析xslt模版了
  ps1:wiki上的cvs上下载的模版所采用的源程序素材好像还是老版本的,zoomq在wiki上提供了一个优化过的版本的程序,有时间尝试转换成模版看看。
  ps2: v V z Z 都被自动的pack到最后。zoomq在python-chinese里告诉我v目前实现的还不太理想,期望是随便怎么放都可以。
  ps3:目前的模版或者说原始素材,messagehead的实现是写死的,并没有通过在xml中定义messagehead来实现。
  ps4:流程基本上是搞清楚了,不过里面的代码好多都没有完全明白,一个字。。。。。学!

  btw:目前otter程序里实际上还有另外的模版实现方案,wiki上也有提到,字典法以及limodou的t模版法,有时间一并研究研究。

其实早就有了心理准备,但是真正等看到了产品的照片以及情况说明还是强烈的感觉到苹果的不凡。

  ipod shuffle——一个没有显示屏、容量在512mb-1G的flash mp3 player.估计也只由苹果敢如此设计。macfans上有不少人在谈没有没有显示屏如何选曲、管理等问题,apple的回答是,不需要。呵呵 生命是随机的 (苹果的广告语) 。苹果通过诠释一种全新的生活理念把其欠缺(更准确说应该是抛弃)的功能变成了理所当然。这或许就是其think diffrent 的最好佐证。
  会给gf买一个,当然我还会继续用ipod来听我的评书(呵呵,这时候没有屏幕可不好找呀)。





  相对于ipod shuffle,我对这个貌似平常的mac mini更感兴趣些。
  有些人觉得它的性能一般是个鸡肋产品,我的感觉恰恰相反。从我自身的需要来说,最近一直在找一种小巧、美观、静音的电脑作为我的电视伴侣,这样我便可以躺在床上看着电视欣赏辛苦的小驴从网上拉下来的众多影视作品(看盗版。。自我检讨一下)。mac mini 从目前的指标上来看,完全可以满足我的要求,最重要的是他的造型既不怪异,又不平凡,感觉上应该可以很好的同影音器材做个搭配。
  当然,具体的质感还只有看到实物才能了解,不过这几年苹果的产品让我失望的很少。呵呵,如果单纯就作为播放器确实有点奢侈,不过别忘了它里面跑得可是纯正*nix血统的os,我不会让它闲着的:)




otter网页上的解释:

otter的来源是在为PyUSS书写测试程序时的小框架,因为在网络应用中会大量使用基于TCP的二进制流通信,所以将这个小框架正式变为一个独立的项目,成为以后相关应用的开发基础。

面对Twisted 完善的网络应用开发框架组织,我们灵机一动,将 Twisted 最典型,最基础也最灵活的 二进制流TCP 传输应用,通过简单的XML模板来自动生成,将会极大的规范化,标准化,可控制化网络应用的快速开发!

子项目

·        
/OtterBase 二进制流通讯框架

·        
/OtterTool 二进制流通讯协议、报文、应用框架工具

·        
/OtterTemplet
Python脚本为解析目标的易用模板模块

通俗点讲,otter的主要作用就是根据一个用来描述网络连接协议的xml文件,通过指定的模版生成适合于Twisted架构的python程序代码。将人们从繁重的编码、解码等机械性劳动中解放出来。

其实,根据通过使用的不同模版,otter完全可以生成适合其他网络架构甚至其它计算机语言的程序,当然,这样就和他的初衷不同了,毕竟是由PyUss发展出的项目。


 

otter目前应该说还刚开始起步,很多形式都没有完全的确定下来,不过毕竟他的设计思路是很好的。


  前一段时间对python产生了兴趣,看了一些资料,发现python所展现出来的风格恰恰是我所喜欢的。如果一边做点东西一边学习,效率会高很多,所以就在python上到处看看。最后发现由啄木鸟上面的pyuss发展出来的otter项目正好也符合我自己一个小项目的需要,所以决定从此入手,一方面看看能不能为这个项目做点什么,一方面也可以帮助自己掌握python。
  不过比较遗憾的是,目前otter项目正处在休眠阶段,很多代码、资料都还不十分完善,尤其是wiki上的内容个人感觉还有些卵(当然主要原因是我还不适应wiki这种方式),所以学习起来比较慢。还好,zoomq在pythoncn的maillist里面给了我一些帮助,目前已经基本了解了otter的目的、解决方案、实施过程,下一步主要就是对其实现的细节进一步的分析,同时我个人也希望能够开发出有更有效(便于建立、修改)的模版方案。
  瞎说了不少,主要是给自己一个鞭策,不要半途而废。
  不学不知道,越学越害怕。呵呵。由于otter涉及的领域比较多(主要有xml,xslt,twisted等),所以,随着研究的深入,自己的学习任务量也逐步加大。哎。。。。书到用时方恨少呀。

2005年01月11日
  我在公司用的是网通提供的以太接入,在家则用的是网络通信(大网通)提供的adsl。

  非常奇怪的是有不少网站(均为合法站点,比如www.linuxforum.net)在家中都无法访问。如果想访问只能通过国外的代理服务器才行,实在令人愤慨。
  我搞不清楚是这些网站屏蔽了我使用的adsl所用的码段,还是adsl线路接入的路由有什么问题。
哎。铁通最近也在我家这边开展adsl业务,哪天去看看线路情况怎样。还是竞争太少了,如果真正再多几家有实力的接入服务商,一切就会好过多了。

  btw: donews 的写文章所用的js模块好像不是太好用,经常出现光标不听话的情况。而且开始的第一行前面还不允许用空格,没办法只能用<pre>来解决。。。

已经全部送完!!如果还能下蛋,继续派送
  还有5个,送完为止。
  刚获得Gmail的时候总想早点能下蛋,结果真的下了蛋反倒送不出去了。我的gmail一窝下了10个蛋,送出去5个,还剩5个,新blog开张,送完为止。(和我同期的朋友的gmail只下了6个,不知道是不是和使用频率或者其他一些因素有关)。
  请写明: firstname ,  lastname , email
  ps:用gmail收maillist真不错。最让我喜欢的是即使我使用smtp方式来sendmail,他同样会把我的信件记录在sent文件夹中,真正做到了在web上保存我所有的信件。
  对了,好像很多邮箱都把gmail的邀请信当成垃圾邮件来对待(呵呵)。所以如果我给你发了邀请你没收到,就到垃圾箱里找找。