2004年06月30日

Jyphon 是用100%纯Java编写的Python,现在版本为2.1。以前叫Jpython,后来改名的。它其实不是一个新东西了,而且自从2.1版以来好象就没有更新过了(在sf.net上我看到2.1版的发布日期是2001年12月31日)。但现在Python已经升级到2.3.4。因此搞不清Jyphon的活力在何处。为什么现在又提起它呢?因为我已经在几处看到关于使用它开发Java程序的一些文章,是不是这是它的一个机会呢?不得而知。文章主要来源于IBM。下面是链接,有兴趣的可以看一看:

可爱的Jyphon 2003/7 这是一篇比较老的文章了

学习如何用 Jython 编写 DB2 JDBC 工具 2004/6

用 Eclipse 和 Ant 进行 Python 开发 2004/6

Jython Bibliography (Jython 参考) 感谢Forestsong提供,上面有许多有关Jython的信息

2004年06月29日

本文原为 Python 的创始人 Guido van Rossum 所写的论文,地址在:Python Style Guide

现在已经转化为PEP(Python增强提议)了。可以访问:PEP 8 Style Guide for Python Code 

上面有代码风格的建议和一些程序写法的建议,对代码风格感兴趣的可以看一看。

这里还有一个由Python开源项目组翻译的中文版,可以看一看:Python开发编码规范 – 翻译自python.org  2004/07/25修改

文章链接:iterators, and the ReloadableIterator

本文章讲述了使用迭代器(在 Python 2.2中新增)的便利之处。但通常的迭代器是不可以重装(reload)的,但在某些情况下允许重装可以简化程序。于是作者设计了一个ReloadableIterator类,用于处理这类的问题。其中还列举了一些示例,及类的详细代码(代码很简单)。此文对了解Python的迭代特性有帮助。 

NewEdit 2.1正式发布,下载地址:

http://pyrecord.freezope.org/download/newedit_2.1r1.zip/down

新增:

  1. 自动检查文件是否被别的程序更新过
  2. 打开文件时可以设置是否自动做备份
  3. 可以重新装入上次保存后的文档
  4. 增加在命令行指定打开文件参数
  5. 在命令行增加缺省使用编码选项

修改:

  1. 修正PyShell窗口的内置函数_与gettext中的翻译函数_冲突的问题,将所有翻译函数改名为tr()
  2. 增加unicode转换出错的处理,并且版本已经不支持非unicode版本
  3. 修正扩展选词不能处理’.'的问题
  4. 读取language.ini文件时,可以过滤掉空行及#开始的行

欢迎大家下载使用,有问题请与我联系。

2004年06月28日

NewEdit 做得越多,更发现许多wxWindows的不足之处。没办法,这些功能只好放弃,等以后成熟再说吧:

  1. 没有可修改的打开、保存文件对话框
    为什么要它呢?因为我想实现象EditPlus一样的在打开或保存文件时可以指定文件的编码,但wxWindows中只可以调用本地对话框,它不提供自已的对话框,更不能进行扩展。
  2. 不好用的目录文件列表
    想用它显示一个目录文件列表,这样用户就可以直接在目录文件列表中打开文件,切换目录会比较方便。wxWindows提供了一个GenericDirCtrl组件,但竟然无法理双击事件。真不知道,提供它有何用。
  3. 不知道如何处理按键记录功能
    wxStyledTextCtrl提供对按键记录状态的事件,你可以激发或禁止此事件的产生。但没找着在哪里去记录它。而且它所谓的记录是针对编辑器已经内置的一些编辑命令,我随意插入一个键很有可能就没有对应的命令。找不到回放的机制,可以使用CmdKeyExecute,但它执行的是内置的编辑命令。为什么不是按键的组合呢。
  4. 不知道怎么用的DDE功能
    想在资源管理器上添加一个用NewEdit打开文件项。使用DDE可以防止打开两个实例。但照着文档敲了几行代码却发现wxPython中好象根本就不存在相应的对象,在wx的库里找了半天也没找着有关DDE功能的实现代码。文档上说是有,但找不着,这叫人怎么用。

以上的特性我目前是无法实现了,当然也可能是本人不知道,如果有知道的一定请告诉我。

随着对wxWindows的更深入了解,可能还有别的功能无法实现。真是让人不爽。不过,程序还是要做下去,只是不象自已想象得那样强大罢了。希望wxWindows功能越来越强。

2004年06月25日

网站:http://wwwsearch.sourceforge.net/pullparser/

pullparser是一个分析HTML的 Python 模块,它来源于Perl的HTML::TokeParser模块。Python 中已经带有HTMLParser模块,并且pullparser也是从HTMLParser派生而来,不过使用起来的方法不一样。

使用HTMLParser需要你定义自已的tag处理函数,何时调用这些函数是由HTMLParser来决定的。相当于你要针对处理的tag编写一些回调函数。

而pullparser则直接对你需要的tag进行处理。

下面是从主页上粘贴过来的一个例子:

import pullparser, sys
f = file(sys.argv[1])
p = pullparser.PullParser(f)
for token in p.tags(“a”):
    if token.type == “endtag”: continue
    url = dict(token.attrs).get(“href”, “-”)
    text = p.get_compressed_text(endat=(“endtag”, “a”))
    print “%s\t%s” % (url, text)

可以看出通过一个循环我可以一次将所有的相同tag进行处理。可以分清是tag开始,还是tag结束。得到tag的属性,得到文本。

不过我原以为pullparser是先将HTML中所有的标记一次处理完毕,然后在内部有个保存,那么你想用哪个标记就用哪个标记。但是,我错了。它并不是预先将所有的标记都处理并保存,而是随着你的调用,找到了就返回,没找到就一直读文件,直到文件尾。

验证这个非常简单。我写了一个简单的HTML文件。然后先调用get_tag查询一个不存在的tag,程序报给我没找到。然后再调用get_tag查询一个存在的标记,程序报给我没找到。只要出现了一次没找到,以后你什么都找不到了。验证了我的想法。如果你看程序的话,它是利用yield来实现的,难怪如此。

因此,对于pullparser的用处我想的确是适用于简单的应用,并且最后你只处理一个标记。如果你要处理许多标记的话,我建议你还是使用HTMLParser吧。

它是一个通用的分析RSS和ATOM的模块,这里是它的介绍:

Universal Feed Parser is a Python module for downloading and parsing syndicated feeds. It can handle RSS 0.90, Netscape RSS 0.91, Userland RSS 0.91, RSS 0.92, RSS 0.93, RSS 0.94, RSS 1.0, RSS 2.0, Atom, and CDF feeds.

它的主页在:http://feedparser.org

它可以把一个RSS处理为Python的字典,这样分析起来相当的方便。它只有一个文件,并且只需要调用一个parse函数。例如这是主页上的一个例子:

>>> import feedparser
>>> d = feedparser.parse(‘http://feedparser.org/docs/examples/atom.xml’)
>>> d['feed']['title']
u’Sample Feed’

可以看出,它支持直接输入URL。我试了试没问题,非常好。它还支持从本地读取文件,再有就是直接处理某个字符串。可以看出它的适应性非常好。它不是作为一个独立的程序运行的,而是作为一个模块,因此你将其应用到的项目中去。

现在最新的版本为3.0.1。

它的作者是Mark Pilgrim,它就是《DiveIntoPython》一书的作者。一个牛人。《DiveIntoPython》一书是用DocBook写的,样式处理得很好。我发现Universal Feed Parser的文档更是出色,我猜想也是用docbook写的,只不过现在看不到文档的源码。不过Mark在这方面真是一个高手啊。

2004年06月23日

这是一篇关于中国Linux历史的记录,虽然我不能算是一个Linux Fans,但对中国Linux发展之路还是感兴趣的。在 中国Linux论坛 上有些讨论。也许你会在里面发现一些认识的人。讨论地址

这篇文章最早是在 中国Linux论坛 上看到的,其中有一些人物多多少少现在还是有些关系。例如其中提到邓光磊,现在就是 中国Linux论坛 的创始人。历史是人创造的!

不仅是我发现,别的使用 NewEdit 的人也发现,有时在 Shell 窗口中执行过一些语句后,再回到文档窗口中时,随着鼠标的移动文本自动会选中,甚至按键都不起作用。这个问题很有趣,为什么执行过Shell命令就不行了呢?后来我发现,这是因为i18n中使用的_()函数与Shell中的_变量冲突所致。在Shell中,执行完一条命令后,命令的结果就保存在_变量中。但i18n把这个’_'使用为一个内置的函数,因此造成两者的冲突。于是我不得不将 NewEdit 中的所有_()函数全部改成了tr()(自定义的),这下子才解决这个问题。从而可以说明,PyShell(使用它生成的Shell窗口)的变量空间与NewEdit是有重叠的。可能也没有办法,因为i18n中的_()函数是通过将其置入内置__builtin__中的,而__builtin__是全局共享的,因此对它有改变势必会影响到别的模块。

还好这个问题是可以解决的。但PyShell好象不支持中文。本来想多实现一些功能,但却带来一些负作用,小心为妙呀。

CZUG 的站长潘俊勇已经开始计划Zope3 Book的翻译,不过可能要等到有更多的人参加才可以。详细讨论见:http://www.czug.org/forums/tech/zope/371694535452

Zope3 Book的下载地址

Zope3是体系结构与Zope2差别很大的新的结构,许多Zope 2的技术已经不能在Zope3上使用,但到底有多大,还没有时间去研究。书我已经下来了,一共有400多页,如果翻译的话工作量还真是不小呀。如果组织得好的话,真是功德无量的事情。