Freewind @ Thoughtworks scala java javascript dart 工具 编程实践 月结 math python english [comments admin] [feed]

(2011-09-13) python三周感言

广告: 云梯:翻墙vpn (省10元) 土行孙:科研用户翻墙http proxy (有优惠)

使用python已经三周了。随着使用的深入,对于它的了解比以前要多,优缺点也有更切身的体会了。现在回头看两周前写的“python一周感言”,总体感觉还是差不多的,看来python真是一个学习曲线很平滑的语言(不像ruby)。

现在就讲一下python与web开发相关的一些问题。这些问题对于web开发来说,是通用的,不论使用哪种语言,都是需要面对与解决的。从另一方面来说,哪种语言解决得更好,哪种语言就更有优势。

一、字符集

python有这个问题上还不错,通常只需要在文件最前面写一句:

# -*- coding: utf-8 -*-

这个文件就会以utf-8的方式编码,通常不会遇到中文乱码的问题。不过如果你调用了第三方的库,要是那边没有使用utf8,或者没有处理好编码,还是有可能出现问题。那时就需要手动进行转码,会麻烦一些。

python3会使用与java类似的方式来处理,但是目前人们广泛使用的还是python2.7。

Java在这个方面做得真是太好了,从Java转到ruby和python的人,都会怀念吧。

评价:四星

二、web框架

使用人数最多、支持最多的还是django。从google的关键字趋势图上可以看到,django的指数比其它(如pylons, turbogears)大20倍,这跟django历史悠久很有关系。另外,现在很多编辑器都对django提供了直接的支持,其它的框架都没这个福气。

python中现在流行的框架有django, pylons, turbogears, cherrypy, 2py, web.py等。但是,python的web开发,真的是远远不如ruby,甚至相对java来说,也不够优秀。这一块不太想详细说,因为自己都觉得没多少意思,感觉挺灰暗的。简单来说,社区薄弱,文档落后,插件少,兼容性差,感觉各个框架的前途都挺灰暗的,说不定什么时候就没人维护了。

如果说原因的话,我觉得应该是“接口”的问题。因为python不像java那样注重接口与兼容性,大家的代码都是互相直接调用。所以经常出现这样的情况:你使用的某一个组件的版本号更新了0.1,都导致整个程序运行不起来了。这比ruby要严重一些,因为ruby对于模块和类结构的规定要完善一些。

评价:二星

三、ORM

Python中目前最有名的orm当属alchemy。其它一些要么没它出名,要么没它好用。alchemy的设计不错,即可以方便地处理遗留数据表结构,又可以很好地使用orm方式来设计,而且这两种方式使用起来,风格的差异并不大。

alchemy有个特点对于提高性能很有帮耗阈戳艘淮蠖汛邮菘舛寥∈莼蛘吒率莸牟僮鳎撬鞘导噬喜⒚挥兄葱校挥械钡饔昧薙ession.flush()或Session.commit()时,才会一次性批量提交,这样可以提高数据读写的性能。比hibernate之类的lazy load要厉害得多。

另外,alchemy使用起来非常灵活,基本上直接写sql能做的,它都能做。虽然灵活,且用法很多,但一旦熟悉之后,并不觉得很难记,这与它的api设计得好有关系。

不过有得也有失,alchemy对于回调支持很差。比如说你有一个对象,希望它在保存的时候,修改与它关联另一个对象的内容,就很麻烦。自己写了一些简单的代码来扩展它,虽然能做到,但是用起来很别扭。

评价:四星

四、模板

python中的模板有四五种,如mako, genshi, jinja等,设计理念相差不大。感觉python中的模板层都做得挺不错的,不论是功能、灵活性和易用性,都很好。我最终使用的是mako,它也是由sqlahchemy的作者创建。

功能上没什么问题,但是我已经习惯了"haml+sass"那样的方式(没办法,这种方式对于布局实在太方便了)。我原以为,同为动态语言,python应该像ruby那样,很容易地就实现了haml语法,结果大失所望,找了几天只找到了几个不太成熟的类haml的库,而且用起来都不顺手。

好在最后发现了一个叫shpaml的,用起来还不错。

评价:四星

五、文档生成

不得不说,python程序的文档网站都很漂亮专业,如:http://pylonsbook.com/en/1.1/。这得益于它们使用的一个叫"sphinx"的一个文档工具,可以直接读取写在源代码中的文档,生成一个漂亮的文档网站。

http://sphinx.pocoo.org/

评价:五星

六、分页

pylons中的分页很简单,可以把一个sqlalchemy的query对象传过去,就直接能分页,再配合一个生成链接的函数,很方便且完美。跟ruby中差不多。

评价:五星

七、循环导入

不能不说,python的这个限制非常不方便:当你使用一个类之前,必须先定义它或者导入它。

当我们使用orm时,通常都会在不同的文件中,定义互相调用的类。

比如,定义了一个User和一个Question,它们都在自己的文件里,且会互相引用,就会很麻烦,而且很难解决。sqlalchemy的做法是,在引用时使用字符串代替,比如User.id要写出"User.id”,虽然可行,但是实在太丑了。其它语言中,基本上都不会出现这样的问题。

转换语言,最大的郁闷就是:之前那个语言的不爽的地方被解决了,但是爽的地方变不爽了。而有时候,不是技术上的问题,而是风格和文化的问题。比如对haml的使用,在ruby世界已经风形,用过的人都说好,但是在python中,唉。

comments powered by Disqus