我学python | experience with the python language

ygao的网络日志 | ygao's blog

My Links

Blog统计

公告

Google Groups
请浏览python_study论坛上的所有帖子
python_study: 但我想一个小组就应该有自己的鲜明的观点和自己的判断力,不然就没有成立的必要了。有同一想法的人,请留下联系的方法。
Creative Commons License
本站所有内容采用创作共用:姓名标示-非商业性-相同方式分享 2.5许可证。
访问计数:

文章

收藏

相册

程序下载

好友

基本概念

学python的好去处

存档


正在读取评论……
2008年05月16日


    摘要:

说了好处,短处也一定要说,web2py的最大短处是不能方便支持跨app的复用,虽然有xmlrpc,但我不喜欢这种方式,如果它不能做到这一点,我也就是玩玩而已,不过它适合个人玩,因为简单但又强大.为了打消掉我不满足,我对web2py的核心代码作了改动,虽然作者没明确表态表示好与坏,但我还是会进行下去.曾向limodou提议过一同改造web2py,但他更倾向再造轮子,对他这个轮子,我会给于关注,不过同时我要进行web2py的app复用,测试链接如下,如果你感兴趣,可以试一试,链接在我的本机上,如果我上线,一般会开.

http://fullip.3322.org/welcome/default/index/4

如果你不懂web2py架构,你不会了解我在说什么    (全文共676字)——点击此处阅读全文



2008年04月02日


    摘要:

无论是python的django还是其它的web框架,与web2py比较起来,都不算创新,web2py的创新在功能上最大的要算是错误可以管理,它不象其它的框架把出现的错误都丢掉,注意它是可以管理这些错误的,可以把错误保存下来,以后可以再现它.总的来说它还太年轻,还没有一个能用的界面.

web2py大量使用'exec'来执行模块,这带来的一个问题,它需要反复读磁盘,即使是编译为.pyc文件仍然如此,我认为在并发下这会是一个io的问题,当然它的开发者不认为这是一个问题,不管怎样这或多或少都会有影响的,只不过是大小的问题,但量变很有可能导致质变,不过我部分的解决了这个问题,注意不是用cache,它仍会随时反映后端数据库的变化,所以这个关于性能的问题不再算是一个问题,代码稳定性还在测试.

web2py对开发者友好,不是一般的友好,是相当的友好,理解它很容易,使用它也很容易,所以强烈建议一个想接触python框架的学习者来说,它应该是你的第一个框架,不要一开始就学django或TG 或pylon.

    (全文共473字)——点击此处阅读全文


2008年03月16日


    摘要:

我都有点不敢相信.看图:各种东西都不缺.

    (全文共71字)——点击此处阅读全文




    摘要:

以前反对过django,但没有拿出替代品,所以反对无效,这回拿出另外一个框架来说事吧.不想作全面的比较,只想说说个人的感受,与diango相比,没有配置,当然更不会有安装一说. 没有所谓的中间件,没有写个url,就必然要写正则表达式, 也没有所谓的哲学, 更没有所谓的条条框框,可能django复杂,我看不懂或是不全懂,

web2py理解容易,当然框架理解容易的多了,但是这个框架对开发者友好,给我的感觉可能是如此.limodou

写过一个shell.py用于测试model代码,但我觉得可以更进一步,不需写这个shell.py,可以更进一步,直接在web上面写个界面出来,岂不更好,初试完成,不想再写了,以后再完善它吧.

    (全文共374字)——点击此处阅读全文


2008年01月19日

在这个分支版本中,我开发了document show窗口,它是编辑器右边的一部分,我去除了弹出式的calltip的窗口,这样做的好处是,可以一直写程序,不受弹出式的窗口的干扰,另外就是它能随着你光标在文档内的移动而显现相应的文档,无论你是正在程序还是正在浏览程序,它可以随时随地的显现相关代码的文档,它与自动完成功能使用了同一线程技术.

目前这个功能只在分支版本中,不在发行版或主版本中.





    摘要:

ulipad产生错误时,会把错写入自身目录下error.txt中,这时你就发现经常是Import.py文件最多,这个在ulipad的中/minixs的文件,而且这个文件有几千行,看这个文件,只怕把你的眼睛都看花了.其实这个文件是在同目录下的__init__.py中记录的以#mXXXXXXXX.py的所有文件的一个映射,这个使用只是为了加快启动的速度,但如果发生错误只会指示这个文件本身发生错误,而不会指示某个mXXXXXX.py发生错误,而实际上是mXXXXXX.py文件真正错误,看Import.py文件的错误我想除了limodou没有人能看懂吧.我也不例外,如果才能让error.txt错误直接指示mXXXXXX.py文件呢?使用我写的/tools/目录下的rundev.py来运行ulipad,这时发生的错误在error.txt的指示中会直接指向mXXXXXX.py文件,这个文件通常很小,也容易读,如果你直接修改这个文件,再运行ulipad.py或ulipad.pyw程序,在error.txt中会直接指向你修改的位置,如果发生错误的话.

 

此处阅读全文


2008年01月17日


    摘要:

很久没有写blog,现在来补一下吧。这件事没有想那么多,一个很偶然的原因,起因于我同limodou的一次交流,征得lomodou同意,我在维护一个ulipad的分支版本,关于事件的过程,limodou的blog有记录:[UliPad]感谢ygao成为ulipad的一名开发者

这个分支的代码库路径是:

http://ulipad.googlecode.com/svn/branches/new_functions_test

此处阅读全文



2007年04月09日


    摘要:reload mixis功能使你在运行ulipad的时候,你就可以为它开发功能,简单地说,写源程序的时候写完功能就可以出来, 因为ulipad大量的运用mixin技术,这是可能的,但这在其它的python程序难以做到,夸张一点的地说,你甚至可以"热修复"。 使用要点:你可以打开ulipad重载mixin功能,当然你也可以不使用它而使用原先的模式,通过工具菜单的reload mixin来完成。 有可能,你写的功能错误,重载后当然不能正常工作,所以建议你复制一份ulipad的目录,通过tools目录下的run.bat运行一个实例, rundev.bat运行reload mixin功能的版本另一个实例,发生错误时,只要改正就行了!    (全文共451字)——点击此处阅读全文


2007年03月11日

最先我是在学python的过程中,想找一个项目练练手,最后我找到了Boa Constructor.后来一发不可收拾,我觉得有些地方,要改改,就不断地增强了它,把我所看到python实现的editor中好代码都加了进去。Ulipad当然也不能例外,当它实现了强大的自动完成的功能时,给了我很深的印象,我就把它的mixin技术移植到了Boa Constructor。我发现的一些关于自动完成的bug及我所做的增强,最先是在Boa Constructor中实现的,后来又把这些提交到了Ulipad的作者:limodou。在Ulipad的邮件列表中,我说focus lost的bug在那里,他说在别处,紧跟着他又说我是对的,接着为了修复此处的bug和另外某处的bug,他重新实现了一小段代码,这段代码他以前用过,是在程序空闲时调用处理bug,这样一来这段代码会反复运行。他要重起用这段代段时,我说了自己的意见,我说是notebook的控件吞吃了kill focus的消息的传递。按“ctrl+tab”键时,focus lost传递的问题在Boa中不存在,这些我也说了,他还是起用了那段代码,为了验证我的想法,修复这个bug,我在Ulipad的源代码插入了5行代码,这个bug就不再出现了。我想我的方案简单的多而且有效,修复了 focus lost的传递的问题。关于函数及class参数的自动完成功能,我所做的增强patch,起先他要想一想更好的,后来我强调说只要5行代码就能用了,是的,它简单得不能再简单了,后来就加入到svn中了。当然他的想法可能更好(见邮件列表),但毕竟还未实现。后来相互交流了一下,我说了一些关于Ulipad的看法,他问了我一些patch的原由,最后是什么样子,对新功能感兴趣的直接去svn  r2013 中看吧。两个各自有不同想法的人,否定,肯定,再否定......,想要把一件事情作好,就是这样一个过程。

  至今Ulipad的源代码有些部分没看懂,我想是我能力有限,另外我要说的是,在源代码的注释及doc_string相对较少,很精练,有些地方恰到好处,有些就没有了,有种惜“注释”如金的感觉。这对于后来者及二次开发者都相对不利,不看完全部的代码,贸然下手,很不利。比如我正在实现的reload mixins的功能就是这样。有一行开关代码,我以为不重要,因为程序没有强调何时调用,我也没有仔细看,结果后来bug就找到此处了。

  有了reload mixins的功能,Ulipad以前的缺点,现在可以说是一种优点了,要重载类就不太容易,但分而治之重载部分功能,那就容易了,而且只要是应用了mixin技术的代码,天生就有了源代码改变,就自动应用它。由于后来Ulipad的一些功能,全都是建立在mixin中的,所以好处不言而喻,现在开发Ulipad,就相当有趣了,不再是重启动再启动,你只需保存,触发,瞬间就可看到结果。甚至你只需写好其本的框架代码(就是Mxxxxx.py文件),实现部分只需等待填入、保存、再写、再保存.....,写完了,功能就出来了。



2006年12月19日

Jolt大奖拥有“软件业界的奥斯卡”之称,svn和preforce都曾获得过。

SVN应该说是CVS成功的继承者,把CVS的缺陷全都克服了。在扩展boa过程,我使用了SVN。随着增加的功能越来越多,我自己都不知道做过哪些改动了。虽然可以在SVN可以查看,可是我用的客户端tortoiseSVN,一个功能就搞一个进程,受不了,一些java的客户端如有类似Tmate一些功能,就非常好用,自此我觉得SVN的功能有受限。接着就使用了perforce,不过除了官方的文档外,很少能找到其它的使用介绍。用惯了SVN,难以学perforce,好在坚持了下来。

perforce很不错,能满足我的要求,功能很贴心,难怪在google的guido要使用perforce做代码预览系统。perforce的主页有与SVN比较的文章。perforce_subversion.pdf



2006年12月13日

前面我搞了一个项目,不过那个项目是空的,因为我想一个得当的工具,用来支持这个项目,

一直在着手这个工具,到现在也没让我满意。

借助于leo,我轻松地实现了文档和代码的分离。试用了一下leo,leo所谓的文学化编程不过是把一段文本结构化,以树形节点的方式再组织文档。leo中的节点不存在固定的子节点和父节点的关系。它的节点高度的灵活,任何时候都可以改变树形的结构的关系,它的核心思想把文档节点化,使得大纲式编程(或文学式编程)成为可能。leo的功能相当强大,但它好象受制于TK的UI的表现力。

我一直想让代码和文档有高度的灵活性,很多人也尝试过这样做。文档写完了,文中的代码也就完成了,但对于文档和代码的维护也不再继续。因些写文档(教程)每个人都要重新再来写一遍,因为没有高度自动化的工具,不能用来反映阅读者和写作者对文档和代码的把握能力。因此我用leo的大纲式编程和我扩展之后的boa,搞出了这样一个原型。代码和文档的分与合能自动化,能随时组合和分离,具有演进的能力。

 



2006年11月04日

一位叫孙骏朋友突然问我,下面的这段代码,在pyshell中运行时不能实时的显示出结果,而在其它的shell环境下,如pythonwin中可以实时显示。如果你在此环境中测试线程,问题就更明显了。

代码如下:

import time
for i in range(5):
print i
print time.ctime()
time.sleep(1)
结果如下:

0
Sat Nov 04 12:52:08 2006
1
Sat Nov 04 12:52:09 2006
2
Sat Nov 04 12:52:10 2006
3
Sat Nov 04 12:52:11 2006
4
Sat Nov 04 12:52:12 2006

在wxpython的pyshell不能实时逐行显示结果。我测试了一下,确实如此。我想结果有点怪,不应如此。
看了一下pyshell的代码,在shell.py中加如下的代码就可以解决问题了。
 
def write(self, text):
"""Display text in the shell.

Replace line endings with OS-specific endings."""

text = self.fixLineEndings(text)
self.AddText(text)
self.Refresh()#add
self.Update()#add
self.EnsureCaretVisible()


2006年09月27日

这是limodou的ulipad的Debug.py模块,独立运行此模块,会出现异常。
试图改正它后,又有一个错误。
类有属性和方法作用域的问题,还有初始化先后作用域的问题。一般我们很少碰到这样的问题。

声明一下:模块中出现的问题无损于程序的优秀性。这也是我要全文张贴的原因
#   Programmer: limodou
# E-mail: limodou@gmail.com
#
# Copyleft 2006 limodou
#
# Distributed under the terms of the GPL (GNU Public License)
#
# UliPad is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# $Id: Debug.py 1504 2006-09-02 04:08:43Z limodou $


DEBUG = True
import types
import sys
import traceback
import time
import os.path

class Debug:

def __init__(self, filename=os.path.abspath('debug.txt'), debug=None):
self.filename = filename
self.reset(filename)
self.debug = debug

def log(self, *args):
self.output(*args)

def info(self, *args):
self.output('[ INFO] -- ', *args)

def warn(self, *args):
self.output('[ WARN] -- ', *args)

def error(self, *args):
self.output('[ERROR] -- ', *args)

def debug(self, *args):
self.output('[DEBUG] -- ', *args)

def traceback(self):
message = traceback.format_exception(*sys.exc_info())
self.output('[Traceback]', ''.join(message))

def time(self, *args):
self.output('[%s] -- ' % time.ctime(time.time()), *args)

def output(self, *args):
if self.is_debug():
#encoding = locale.getdefaultlocale()[1]
encoding = 'utf-8'
out = open(self.filename, 'a')
for i in args:
if not type(i) in [types.UnicodeType, types.StringTypes, types.StringType]:
s= repr(i)
else:
s = i
if type(s) == type(u''):
out.write(s.encode(encoding))
else:
out.write(s)
out.write("\n")
out.close()


def reset(self, filename):
if self.is_debug():
open(filename, 'w')
self.filename = filename

def is_debug(self):
if not DEBUG:
return False
if self.debug is None:
return DEBUG
else:
return self.debug

debug = None
error = None

if __name__ == '__main__':
debug = Debug()
error = Debug(os.path.abspath('error.txt'))
debug.log('log')
debug.info('info')
debug.warn('warn')
debug.error('error')
debug.debug('debug')
 
 
 


2006年09月05日


    摘要:我想强调的是:不是说web架构都是MVC的模式就是好框架。 我认为的好的框架的重要的相当高的重用代码的能力,这个我曾重复多次。 在dj中的middlewave的使用,有采用回调形式调用的。这样做是简单了很多的问题。但随之而来的问题如果你不进去看一看middlewave做了什么,不采取copy的形式,你根本重用不了middlewave的代码。回调过于简单,没有任何的接口可以遵偱。 还有一个全局的dispatch的hook的问题,这个用得越多,离MVC的之间的关系,就会越来越远。          (全文共316字)——点击此处阅读全文


2006年08月29日


    摘要:最近,大家都在谈论guido谈论到django的话题。   “Guido just pronounced: Django is the [Python] web framework Won’t be part of the core, but will be as ‘standard’ as PIL or NumPy This was not what I expected the outcome of my talk would be, but hey, I’ll take it H    (全文共943字)——点击此处阅读全文