这里记录自己在python编程中遇到的一些小坑,不断更新中。
关于tornado的handler终结
一开始我一直以为tornado在调用write之后就表示此handler终结了,后来我发现错了。
首先,我发现write方法可以被调用两次:
1 | self.write("hello") |
即使是finsh方法,后面的代码也会继续执行。
而且self.finish()
是用来主动与客户端断开连接的,一般也是因为@tornado.web.asynchronous
装饰器会一直保持连接而配合使用。
所以还是要加return:
1 | self.write("give me five") |
没有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 | if 5 == 5: |
当然一开始就声明,有时还是很有必要的。
1 | response = None |
如果你不声明response=None
,那么如果请求报了异常,response这个名字是不存在的。
单个值元组
正确的写法是: (1,)
而不是(1)
,后者明显是带有括号的表达式
ConfigParser
要以正确的类型声明去读取配置
1 | _cf = ConfigParser.ConfigParser() |
尤其那个bool类型,if "FALSE"
的结果你觉得是啥?