2010年5月9日星期日

Python的杂乱无关物

关于Python的

A
先说编辑器
任何带语法高亮的文本编辑器都能拿来用
像什么notepad++,geany,jedit,...
Emacs上写Python用的话,一个不复杂但可用的方案是:
python-mode + ropemacs + yasnippet
这是几个比较集成的包了
要不就在Eclipse上PyDev,更加集成来着。

B
维基百科上PyQt4的示例:
#!/usr/bin/env python
#coding=utf-8
import sys
from PyQt4.QtGui import *
app = QApplication(sys.argv)
label = QLabel(u"你好世界",None)
label.show()
sys.exit(app.exec_())
然后,就是涉及信号槽的使用了。
见PyQt文档的new-style-signal-and-slot-support一节。

C
一个PyGame示例:
import sys
import pygame
pygame.init()
size = width, height = 640, 480
black = 0, 0, 0
screen = pygame.display.set_mode(size)
while 1:
....for event in pygame.event.get():
........if event.type == pygame.QUIT:
............sys.exit()
....screen.fill(black)
....pygame.display.flip()
这里没用Sprite和OO的结构。

D
用lua直接重写,以示比较:
其中用到通过LunaticPython调用pygame
http://lua-users.org/wiki/LunaticPython
古董级VC6只改了"luaL_openlibs(L);"居然编译过了
--# Head Start #--
require("python")
local py=python.eval
local pe=python.execute
local pg=python.globals
local u=function(text)
return python.builtins().str.decode(text,"utf-8")
end
local t=function(a)
l=python.builtins().list()
for _,v in ipairs(a) do
python.builtins().list.append(l,v)
end
return python.builtins().tuple(l)
end
local index=function(t)
return python.asindx(t)
end
local slice=function(seq,...)
local b=python.builtins()
return b.tuple.__getitem__(seq,b.slice(...))
end

--# Program Start #--
pygame = python.import("pygame")
pygame.init()
size=t{640,480}
screen = pygame.display.set_mode(size)
font=pygame.font.Font(u"C:\\WINDOWS\\Fonts\\simsun.ttc",32)
text=font.render(u"你好啊",1,t{255,255,255})
pygame.display.set_caption("LuaDemo")
while 1 do
event = pygame.event.wait()
if event.type == pygame.QUIT then
break
end
screen.fill(t{0,0,0})
screen.blit(text,t{64,64})
pygame.display.flip()
end
LunaticPython本身的代码不复杂来着,直接用了python和lua给C提供的接口。
感觉上用起来觉得lua的table比python的dict轻量好些,就这样了。
有个bugfix的分支在 https://code.launchpad.net/lunatic-python ,还是建议用这个版本吧。


E
曾试过用swig给lua做过一个绑定,是拿之前写的C++框架改的,想Override虚函数是很麻烦的。
不过参看Pygame的实现,可以分为三个部分:SDL的函数补充,到python的绑定,python写的框架(比如Sprite的实现)。
所以绑定部分可以直接function2function,class2userdata,然后框架部分用lua实现,SDL的C函数直接移植。
这样看给lua重写pygame也不算很费事的,不过暂且还是先拿py的库来直接用吧。
况且Model和View要分离呢,用什么库和逻辑部分的代码间影响不大。。。

F
下面备份用过的makefile,很dirty的。

SRCS = $(wildcard *.cpp)
OBJS = $(patsubst %c,%o,$(SRCS))
LIBS = -lSDL -lSDL_image -lsmpeg -lSDL_mixer -lSDL_ttf -lSDLmain
all: svl
svl:
swig -lua -c++ svlua.i
g++ -shared -O2 $(SRCS) svlua_wrap.cxx $(LIBS) -o svl.so -I/usr/include/lua5.1 -I/usr/include/SDL -L/usr/lib/lua5.1
win:
C:\workspace\lib\swigwin\swig -lua -c++ svlua.i
g++ -shared -O2 $(SRCS) svlua_wrap.cxx $(LIBS) -o svl.dll -IC:\workspace\lib\lua\include -IC:\workspace\lib\SDL\include -LC:\workspace\lib\lua -LC:\workspace\lib\SDL\lib -IC:\workspace\lib\lua\ -l C:\workspace\lib\lua\lua51.lib
copy:
cp ./* /home/zhang/workshop/linux/lua/sdl/
clean:
rm -f *.o
rm svlua_wrap.cxx
这个是以前给Lua做了一个SDL的绑定,比较失败的地方是把框架部分写在CPP代码里了。其实cpp部分只要提供函数和具体类。然后什么对象层次之类的东西用脚本去扩充,然后最多在C代码写点有性能要求的Helper函数。SWIG对lua不支持参数传入派生出的对象的,对Python支持更好一些。不过作为根据头文件生成自动绑定的工具,已经很好用了。

编译LunaticPython,它自带的参数是用于Linux下gcc的(LP上的补丁版本编译没有任何问题),因为我python和lua都是VC编译的,所以就手写一回参数吧:
set INCLUDE=%INCLUDE%;D:\VS.NET\VC7\INCLUDE;C:\workspace\lib\lua\include;C:\Python26\include;C:\workspace\lib\lua\
set LIB=%LIB%;C:\workspace\lib\lua\;C:\Python26\libs;C:\workspace\lib\lua
cl pythoninlua.c luainpython.c pylua.def /opylua.dll /O2 /GD /LD /MD /link lua51.lib python26.lib
文件pylua.def里面是
LIBRARY pylua.dll
EXPORTS
luaopen_python
initlua
如果在Py中用的话,就文件名写成"lua.pyd"。Lua中用的话,就用 package.loadlib("pylua.dll", "luaopen_python") 。

G
tcc与cint,这是分别来对付C和C++的。除编译功能外,都可以对源代码直接执行。
tcc之前一直用的,它依照C99并兼容gcc的语法。它以轻巧的代码实现了一个c语言的编译器。
这也就是说在需要编译速度时可以用tcc来写,然后gcc编译时再估计代码生成优化。
cint是C与C++的解释器,并实现的一些编译时间优化。
不过它源于ROOT项目,定位是用于工程计算,实现了一个涵盖C与C++大部分特性的子集。
用于尝试算法还是很适合的,STL也是有的。不过我拿写过的CPP特性的练习代码,和一些第三方代码来跑,可惜没编译通过。不过Cint实现了一些它自己的绑定来着。

H
拿Python来写简单的和网络有关的应用,这里分几方面来说:
首先是抓取网页有关的。
最基本的是用来访问网页的话用urllib2,解析HTML用HTMLParser。
还有的就也有一些以lib结尾的各种协议客户端了。
另一方面是实现服务器的角度。
Python里自带了一个Http的文件服务器实现,使用方式是"python -m SimpleHTTPServer"。它一层层地基于另一个库SocketServer,也有CGI支持和多线程功能。
不过这些相对于socket已经是比较高层的封装了。
以上这些库在在2to3里有了名称上的重新分类。
写Web应用的话,处去直接写服务器。有cgi和使用Web框架两种方式
前者基于cgi和cgitb这两个库,后者就是像web.py那样的,Django更普及一点,不过还功能不够集成来着。

I
打包工具
pyinstaller
http://www.pyinstaller.org/
果然很好用的一个东西,不过由于编译器(Py2.5是用VC2003的)的关系,对Py2.5分支的支持目前最好来着。我这Py2.6也Work来着。
它可以分析py文件的依赖关系,然后生成一个不对本地有依赖的绿色版本。使用Pygame和PyQt等第三方库都可以的。
使用步骤是
Configure.py
Makespec.py /path/to/yourscript.py
Build.py /path/to/yourscript.spec
其中在Makespec.py时,可以附加一些参数。
我无聊地试了试
import lua
import pygame
lua.require("__init__")
然后打了一个onefile包,居然也工作。

J
来发泄下不满,既然决定做Python黑了,就要做到底!
严格的缩进确实很有必要,即使是C我就很喜欢K&R风格缩进(别的风格也可以来着)。不过这里的关键是,缩进是否影响语义。在Py的缩进的语义下,写代码是明了了,不过在代码修改时就是有在找麻烦的感觉。移动一段代码的话,为了让他语义不变,就要去调整一下缩进。
下面说的是,Py对闭包支持有限,而且没有原型继承。首先是闭包这东西,其实C也没有,而且C里面为了实现的简单,把函数定义嵌套也免了。对于整个C代码,就是由main,可导出,未导出的函数和全局变量组成。然后嘛,函数名是作为指针来用的,这里没感觉什么来着。不过问题在于,Guido自己也说过,Python对函数编程的支持就是残缺,而且也不鼓励那种风格。话是没错,不过写着过程式的代码,还不时写点不大好用的闭包,这种感觉,唉。
关于原型继承,这东西绝对是很有用的东西。单实例类和类型的膨胀问题在原型继承下都可以很不错的解决。而且最关键的是,开发效率。这不是说写代码的效率,而是说思考的效率。是去思考一个实际的对象原型容易,还是去设计或派生一个类简单呢。有时候用过好用的东西,以一个现代语言的态度去用却用不到,就也是种别扭。
接口!对Python的Duck Type确实是接口上的便利,一个对象能拿来用,而不用管它是什么类型。不过如今这种动态语言成为“标配”的特性,已经不值得炫耀了。但是看看Py代码中那种一行行代码像面条一样的拖下来就感觉恶心。对于一大堆代码,值得关心的是它在做什么,有如何的结构,能跑过哪些测试,而不是在有闲暇去看他怎么一步步做。对于写算法,或写命令Py的风格是合适的,但是想写出难以重构的结构混乱的代码却是容易的。当对代码的关注点转移时,Py的风格是否同样仍是最有效的方式呢。
恩,今天就黑至此。因为把Python拿出来用用确实挺省事的。
----
我还想要php/Javascript里那种list和dict混合型的array来着。。。

K
年初尝试过一个简单的脚本解析模块,目的是可用于AVG和RPG的数据文件。
虽然已经把能用和实现简单作为要点了,直接把脚本当批处理一样用。
不过实在功能太残,用起来就是自找麻烦啊。不过想在会看那种诡异的语法还挺有趣的。
基本语法是[obj msg arg],脚本的存在和脚本的执行都是在一个嵌套的Map上进行的。
然后又多重预处理器,让"$a=$b+1"先是优先级"[$a]=[$b+1]"在分析出[$a]是[$ a]对$发出一个无参数的消息a,那么执行结果是找到变量a来着。然后本身执行环境也是一个嵌套Map来着。一个变量在自己这个Map里找不到,就去__path__里找,用$new的话,则在当前Map建立一个空值。
不过问题是怎么实现闭包来着,还没那么考虑过。那样的话Map的成员就都是引用了,看那个对象引用数为零在删掉?
嘛,这样的脚本的好处是可以这样写:
map npc1:var __ npc;var pos 2 1;var touch [say "yOu CatCH Me!!"];
map npc2:...
貌似很直观来着。

L
Python Documentation
http://www.python.org/doc/
Python 绝对简明手册
http://wiki.woodpecker.org.cn/moin/PyAbsolutelyZipManual
Python 2.4 Quick Reference Card
http://www.digilife.be/quickreferences/QRC/Python%202.4%20Quick%20Reference%20Card.pdf
除去dir/help命令,或许可以用来速查的东西。
然后这个也有时是值得看看的 http://www.debian.org/doc/

M
在Py字典和对象的关系,估计有人写过这个话题,而且肯定写得还不错的。
我只能来列举点我暂时知道的了(貌似文档里提到的),还很可能有差错:
可以有dict['__metaclass__']存在,对我下面用不到来着。
对象方法的第一个自动的参数self即是自己,
当类方法用时则不会隐式在调用时添加这个参数。
在py中字典[]和.貌似(?)不通用的,属性的操作方法不等于它的Key。
setattr方法等价于使用self.name = value,可由Object来override属性__setattr__
x[i]等价于x.__getitem__(i)和type(x).__getitem__(x, i)。
在class定义的变量函数什么的属于class这个包,不是实例的。
下面的两种写法是等价的
>>> class X(object):
... a = 1
...
>>> X = type('X', (object,), dict(a=1))

type函数的三个参数将分别给对象的__name__,__bases__,__dict__属性
在2.5中是混合着两用对象style来着。
最后来说在Py中字典和对象的关系:它们是不同的类型,但用法有点像。
恩,去看 http://docs.python.org/reference/datamodel.html 吧。

N
ECMA-262
http://www.ecma-international.org/publications/standards/ecma-262.htm
目前比较值得看的是第三版和第五版
是叫ECMAScript来着,做嵌入脚本也相当不错。
有点是简单高效,不足是没有统一的实现(不过也有很好的实现来着)。
有个第三版Html格式的:http://bclary.com/2004/11/07/

O
Java里
有jPython,可以用Py写成的库,以及Java的库,然后编译成class文件
Javascript的嵌入貌似是j2se自带什么Engine?暂且还不熟悉。Qt也像是学着来着。
Lua有个luaj,是其解释器的Java实现,分J2ME&J2SE版本,用于解释嵌入或使用Java库。
不过Lua目前没有统一的继承实现方法,虽然有调用对象方法的语法,但实现对第三方库继承还是不便的。

P
Python的正则表达式的库叫re。正则表达式可以编译为状态机,所以使用正则表达式的话有表意和性能上的优势。
不知什么时候这就成成了大多语言的标配了。
虽然Perl的风格可能影响更大一点,不过对照来 http://docs.python.org/library/re.html 来编写字符串相关功能的话也不是很大的负担。
平时的话在文本编辑器里执行搜索替换操作,re也是会用到的东西。
正则表达式在Py用r""传给re库,字符串里大多字符就是字面的意思,还有一些符号表示扩充的意思(如在宽度和长度上代表多个值),也有向表示或者或括号的运算符号。

Q
感觉使用Python的时候,要陷入他的审美观中,才能用起来有点感觉。
比如Py的没有Scheme那种严格的静态作用域的可是规则,变量就全局和局部按模块分,在继承时就是按照名字来的《---这是在说什么。
然后另一个审美上的就是带了一个大库,一大包的话一个HelloWorld都是庞然大物。
用Emacs默认的低行数看面条式代码可以减少视觉压力。
不过这年头库多了,也算一种种语言了。

R
Emacs-w3m居然在windows下可以用,配合一个color-mode的好主题还是蛮好看的。
Emacs和Python的各自制作的mode区别是,前者维护较积极,后者与Python集成好。自己目前在用后者,不过觉得他的语法高亮好基本,就是也算清爽啦。
不过我就看Emacs是快捷键多的可扩展文本编辑器来着,看了别人的配置文件就有引用了几行。
注目:换行是C-j来着。

S
Lua的社区,官方自己更加关注一个灵活高效便携的核心。所以Lua更适合做嵌入使用,不过也有一些那Lua写应用的项目。
可以参考的是:
lua官方的社区的目录
http://www.lua.org/community.html
一个用lua写网络应用的集合项目
http://www.luarocks.org/
一个集成的包管理系统
http://www.keplerproject.org/
不过都到综合应用的层面,语言纯洁倒成为次要的了。

T
再写就真的却来却杂乱了。嘛,其实也只是以记录一时感受来开这个贴子的。
意义也就是纪念价值吧,离写满26个字母还有一段距离的,我还是去开开别的帖子吧。
不然就不是叫写补充,而是在堆杂货了。况且一直写下去,自己还是所知有限。
貌似之后写的东西没来贴代码来着。

U
有吗,这部分有吗?

没有评论: