两周前,去看了一下limudou的博客,发现他最近关注一个新的Python框架web2py,开始我还误以为是webpy。 我跟着去web2py的主页看了一下,ORM很棒。不由得和拿它和Django做个比较。Django是非常Pythonic的,深得Python之父Guido van Rossum的赞赏。但也不是完美到一点毛病没有。 Django的ORM很强大,特别是对于多表关联,让程序员用起来很舒服。我就认为它比SqlAlchemy好,易用,又提供可以让你写自己的where条件的方法。但有人就说它的ORM效率低,据说稍微复杂一点的操作,它要生成的几十条SQL语句。另一个我无法忍受的是Django的模板,太单薄了,什么都得自定义Tag。内置的Tag连比较两个变量都没办法做,有它还不如没有它。 再看看web2py的ORM,由于之前受够了SqlAlchemy的绕来绕去,一见web2py,那感觉就是很爽很直接。在模板上,大概受了一类模板技术(如Savant,ZendFramework)的影响,模板逻辑上直接用Python语言,很原生态。 limudou翻译了web2py的文档,大家到这里看看 http://fy.py3k.cn/p/web2py/cookbook/cookbook.html。
莲花山,一个折腾父母的小孩
2009年7月22日 00:38
今天下午,和几个朋友去莲花山逛逛。 下坡路上,一个30多的女子独自骑着童车,引得众人好奇。不一会儿,一个30多的男人背着睡着的小女孩赶上来,众人才恍然大悟,猜测是小女孩吵着要把自己的童车带出来玩,可下山的时候,又耍赖要爸爸背,她老妈就只好收拾车子了。 女子有一点儿尴尬,向孩子爸爸抱怨:“下次不让她把车子带出来了,根本不玩都要我们扛着。”我们在后面偷着乐:“这样的孩子,可真能折腾父母!”
SQLAlchemy中的expression类型与None相等
2009年7月22日 00:38
在SQLAlchemy中,无论你要找的字段table.c.name,还是你的查询条件table.c.id==1,都是一个表达式expression。 但这里有一个陷阱,这些expression居然和None相等: None==expression 所以判断时,要使用绝对等于 expression is None (相当于其他语言的===) 其实Python中的普通表达式是不等于None的,不信你试试 1 2==None
Python 调用超类初始化方法的困惑
2009年7月22日 00:38
Python中调用超类方法和其余语言迥然不同,如果子类SubClass要调用超类SuperClass的方法foo(),应该是 class SubClass(SuperClass): def foo(self): super(SubClass, self).foo() #我没有写错,第一个参数是SubClass 其实在Python2.2版之前的是这么写的 class SubClass(SuperClass): def foo(self): SuperClass.foo(self) 之所以要改版,就是为了解决多重继承中的“钻石形状问题”: B(A), C(A), D(B), D(C),具体中间出了什么问题偶也不清楚。 但这个新式写法,本来用得好好的,昨天居然出问题了。 class SubClass(SuperClass): ...
Python的Tuple,Dict参数解包示例
2009年7月22日 00:38
有个函数(方法),用于格式化日期: def format_date(year, month, day): year = int(year) if year
为ThinPHP写了一个项目生成小程序
2009年7月22日 00:38
ThinkPHP 是一个国产的优秀PHP框架,开发者为流年(世纪流年这个Blog,相信不少PHPer知道,我当年就从中获益匪浅)。 好久都没有去,今晚上去看看,又有新发现。 圣诞节,ThinkPHP发布了新版本,同时有网友提供的ThinkPHP项目结构的生成程序。本来我想写个Python版的项目生成程序,现在的我对Python最拿手,可有人抢先一步。 我只好折腾一个其他的,我看了一下Python版和Ruby版的都是命令行的。好在D语言是做桌面程序的行家。现学现卖,终于给弄出来了一个,不敢藏私,拿出来给TPer们使用。 东东在这里 http://bbs.thinkphp.cn/read.php?tid=37
D语言的第一个图形界面程序
2009年7月22日 00:38
元旦放假,赋闲在家,学了一下D语言,完成了第一个GUI程序。 需要的东东,D语言的编译器DMD和DMC,还有GUI开发包DFL,还有一个IDE: dmd.zip http://ftp.digitalmars.com/dmd.zip dmc.zip http://ftp.digitalmars.com/dmc.zip dfl09601.exe http://www.dprogramming.com/dfl09601.exe entice084.exe http://www.dprogramming.com/entice084.exe 安装,先在D盘创建一个目录ddev: 将dmd.zip、dmc.zip解压到d,其中dmc.zip中的dm目录会覆盖dmd.zip的dm目录。 将dfl09601.exe和entice084.exe安装到目录 设置,将环境变量中的Path中添加 D:\ddev\dmd\bin;D:\ddev\dm\bin; 第一个程序,文件first.d代码 #!/usr/bin/dmd /* My First D Win32 Progamme */ private import dfl.all; class MyForm: dfl.form.Form { // Do not modify or move this block of variables. dfl.label.Label LblPrompt; dfl.button.Button BtClose; this() ...
Python删除整个目录
2009年7月22日 00:38
如果想删除某个目录及其下面的所有目录和文件,可以用如下方法。 def removeall(dir_file): """ 删除dir_file文件,或删除dir_file目录及其下面的所有目录和文件 """ import os if not os.path.exist(dir_file): return #文件或目录dir_file不存在 if os.path.isdir(dir_file): #dir_file是一个目录 for root, dirs, ...
Twisted的日志功能
2009年7月22日 00:38
我的Python需要一段代码记录日志,要把我程序中的print输出和异常输出都记下来;还要自动按天存放,一天一个日志文件,文件名要含有日期。 那么下面是你想要的,用到了Twisted框架: ### dailylog.py from twisted.python import log, logfileLOG_DIR = '/var/run/logs/' VERBOSE = Truef = logfile.DailyLogFile("log", logdir) log.startLogging(f) ### use.py from dailylog import log, VERBOSE def main() : a = "Hello World!" if VERBOSE: log.msg( "a is " str(a) ) if __name__ == '__main__': ...
MySQL的编码为utf-8_bin,Text字段显示不正常
2009年7月22日 00:38
问题出在MySQLdb,当编码为bin时,Text字段取出来是一个“字符数组”的形式。 我第一次是在Django中发现的这个问题,解决方法是,在Django的settings.py中加入如下代码 from MySQLdb.converters import conversions conversions[252] = [(None, None),] 另外,如果我想在一个Django项目newproj中,使用另一个Django项目oldproj的某一个应用pubapp怎么办? 在newproj的settings.py 开头添加 import os os.sys.path.append(’/path/to/oldproj/pubapp’) 如果想单独使用Django的ORM功能,可以这样: 先copy一个settings.py文件,然后在你的项目入口文件中,使用: import os os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'