posts - 403, comments - 310, trackbacks - 0, articles - 7
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Python 学习笔记 (4)

Posted on 2007-08-02 00:30 ZelluX 阅读(321) 评论(0)  编辑  收藏 所属分类: Scripting
1.基于dictionary的字符串格式化
>>> params = {"server":"mpilgrim", "database":"master", "uid":"sa", "pwd":"secret"}
>>> "%(pwd)s" % params
'secret'
这个东西的用处在于和locals的搭配使用,比如样例程序中
def handle_comment(self, text):
    self.pieces.append(
"<!--%(text)s-->" % locals()) 

就读取了text变量的内容。
不过这样和直接用text变量有什么区别呢?貌似"<!--%s-->" % text也可以啊
水木上问了一下,得到的答案是
发信人: Essien5 (宝贝晶~), 信区: Python
标  题: Re: 关于locals()的用处
发信站: 水木社区 (Thu Aug  2 11:16:37 2007), 转信

好处就是多个变量是代码很好维护,一一对应
'%s%s.......%s'%(a,b,c,d,....,z)
'%(a)s%(b)s......%(z)s'%locals()
第一种写法前面的%s和后面的变量很难对应起来,bug的源泉
后一个就非常直观了
而且要往中间再随便插变量也方便


2. 自己的类继承了SGMLParser后,需要对特殊标记处理,可以以start_或do_开始命名相关函数。
可以这样做的原因在于python的自醒机制(introspection)

    def finish_starttag(self, tag, attrs):
        
try:
            method 
= getattr(self, 'start_' + tag)
        
except AttributeError:
            
try:
                method 
= getattr(self, 'do_' + tag)
            
except AttributeError:
                self.unknown_starttag(tag, attrs)
                
return -1
            
else:
                self.handle_starttag(tag, method, attrs)
                
return 0
        
else:
            self.stack.append(tag)
            self.handle_starttag(tag, method, attrs)
            
return 1
程序首先尝试获得start_tagname的方法,如果失败则继续尝试获得do_tagname,如果仍然不能找到,则调用unknown_starttag方法。
感觉这和Java的反射机制很相似,例如Javabean中的getter setter方法,也是通过特殊命名的形式让其他对象了解自己的。

3. import 语句可以写在任何地方。

只有注册用户登录后才能发表评论。


网站导航: