Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1222687
  • 博文数量: 233
  • 博客积分: 6270
  • 博客等级: 准将
  • 技术积分: 1798
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-26 08:32
文章分类

全部博文(233)

文章存档

2011年(31)

2010年(202)

我的朋友

分类: Python/Ruby

2010-08-26 15:17:38

python从2.x到3.x的升级,有较大的差异,导致很多脚本无法完全重用,以下是一些从网上收集到的资料汇总:

《使用2to3将代码移植到Python 3》

《编写兼容Python2.6与Python3.0的程序》

想在2.6版本尽量利用3.0的特性,要求写出的代码尽可能地在3.0版本下也可用,或者只要稍微改动就可以。目前我想到的几个点:

o 使用3.0的print函数。
在py2.6里可以简单使用print的函数形式:
print(”fish is here”) #但是这毕竟不是函数,任何其它形式都会报错,比如:
print(”fish is here”, file=sys.stderr) #报错,print仍然是一个语句,而不是函数
在程序最开始的地方加上:
from __future__ import print_function
就OK了

o 以3.0的形式写字符串,不加任何前缀即是unicode字符串,加前缀”b”是bytes类型
py3k重命令了字符串类型,并且改动了它们的记法。括号内是python的版本。重命令的类型:
str(2.6) => bytes(3.0)
unicode(2.6) => str(3.0)
改动的字符串记法:
“fish is here”(2.6) => b”fish is here”(3.0)
u”fish is here”(2.6) => “fish is here”(3.0)
为了在py2.6程序里使用py3k的写法,可以在程序最开始的地方加上:
from __future__ import unicode_literals
碰到需要bytes的地方注意加b前缀。貌似在2.6版本里,struct.pack()第一个参数不能是unicode,这应该是个BUG。另外,__init__.py里,__all__列表的元素必须是bytes类型,不知道这是BUG还是特性(2.6里测试是这样的)。

o 有时候需要判断字符串的类型,看看它到底是unicode字符串还是bytes类型。因为在py3k里没有unicode类型,所以在2.6里要:
try:
str=unicode
except NameError:
pass
if isinstance(s, str): #unicode字符串
pass

o 使用3.0的io库。io库提供了一个更合理的file类型。在py2.6代码里使用
io.open()
来代替
open()

o 不使用old-style class的特性。只要重载了__attribute__()之类的特殊方法,就要考虑是否应该继承自object

o 所有异常继承自BaseException

o 注意’/'与’//’的差别
from __future__ import division

o 捕获异常到某个变量,使用as关键字
#在py3k里错误,在py2.6里不好的写法
try:
raise Exception
except Exception, e:
pass
#良好的写法
try:
raise Exception
except Exception as e:
pass

o 捕获多种类型的异常
try:
io.open(filename,”wb”).write(b”haha”)
except (IOError, OSError):
pass
我自己经常搞错,呵呵。不能写成:
try:
io.open(filename, “wb”).write(b”haha”)
except IOError, OSError:
pass
这种写法在py2.6里面是指捕获IOError类型的异常,并赋值给OSError这个变量。

o py3k里没有xrange()函数,可以统一用range(),或者
try:
range=xrange
except NameError:
pass

o 迭代子(iterator)的next()函数在py3k里被改成了__next__(),可以使用内置的next()函数
next(itor) 相当于itor.next()或者itor.__next__()

o 绑定对象的im_self函数现在是__self__。im_func改名__func__

o 有些模块的名字已经改了,在import的时候要注意:
try:
import xmlrpclib
except ImportError:
import xmlrpc.client

被改名的模块:
_winreg
winreg

ConfigParser
configparser

copy_reg
copyreg

Queue
queue

SocketServer
socketserver

markupbase
_markupbase

repr
reprlib

test.test_support
test.support

被重新归类的模块:
dbm (anydbm, dbhash, dbm, dumbdbm, gdbm, whichdb).
html (HTMLParser, htmlentitydefs).
http (httplib, BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer, Cookie, cookielib).
tkinter (all Tkinter-related modules except turtle). The target audience of turtle doesn’t really care about tkinter. Also note that as of Python 2.6, the functionality of turtle has been greatly enhanced.
urllib (urllib, urllib2, urlparse, robotparse).
xmlrpc (xmlrpclib, DocXMLRPCServer, SimpleXMLRPCServer).

更详细的信息应该看一看py3k的”what’s new”

阅读(823) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~