Pulpcode

捕获,搅碎,拼接,吞咽

0%

python编程中遇到的一些“小坑”

这里记录自己在python编程中遇到的一些小坑,不断更新中。

关于tornado的handler终结

一开始我一直以为tornado在调用write之后就表示此handler终结了,后来我发现错了。

首先,我发现write方法可以被调用两次:

1
2
self.write("hello")
self.write("world!")

即使是finsh方法,后面的代码也会继续执行。

而且self.finish()是用来主动与客户端断开连接的,一般也是因为@tornado.web.asynchronous装饰器会一直保持连接而配合使用。

所以还是要加return:

1
2
self.write("give me five")
return

没有i++ 但是有 ++i

我知道python是没有自增运算符的,对于自增只能这样写:i+=1,但是有坑。。。

python是没有i++,但是有++i,更神奇的还有–i,但这并不是什么自增运算符,而是正负号,诸如负负得正之类的。

append

list有一个方法叫append,有一次我尝试用这种方式调用:

1
return seq.append('mm')

实际上这个方法会修改列表本身,但是返回值不是此列表,是None。要是这么写就更蛋疼了:

1
seq = seq.append('mm')

空字符串也可以做切片

直接看代码就行了:

>>> s = ''
>>> s[3:]
''
>>> s[:3]
''
>>>

if, for , try 没有产生作用域。

之前一直受类c语言的影响,以为python的缩进就自带大括号了,后来才发现我想错了。

现在看来,类似函数才会产生新的作用域。

比如下面的代码是完全没问题的:

1
2
3
if 5 == 5:
a = 5
print a

当然一开始就声明,有时还是很有必要的。

1
2
3
4
5
response = None
try:
response = requests.post(url)
except Exception, e:
print response, e

如果你不声明response=None,那么如果请求报了异常,response这个名字是不存在的。

单个值元组

正确的写法是: (1,)而不是(1),后者明显是带有括号的表达式

ConfigParser

要以正确的类型声明去读取配置

1
2
3
4
5
_cf = ConfigParser.ConfigParser()

_cf.get()
_cf.getint()
_cf.getboolean()

尤其那个bool类型,if "FALSE" 的结果你觉得是啥?