Python3.x和Python2.x版本兼容问题

  • Post author:
  • Post category:python


Python3.x和Python2.x版本兼容问题

重组和重命名

标准库

为了一致性和使用起来更容易,Python的标准库在Python 3已经被重组了。所有的模块名现在符合Python代码的风格引导,PEP 8

[1]

;并且一些模块被合并了。

2to3

包含的固定器可以处理所有的这些,所以这个章节更多的是引起你是否需要不用2to3转换同时支持Python 2和Python 3的兴趣。

six模块

[2]

对大多数重组的标准库的整合都有支持。你可以从six.moves导入重组的模块:

>>> from six.moves import cStringIO

在Python 2这等效于:

>>> from cStringIO import StringIO

然而在Python 3这将等效于:

>>> from io import StringIO

如果你想要不用转换并且不想用six模块同时Python 2和Python 3,这也是很容易的。你只需要偿试从一个位置导入,捕捉错误然后从其他位置导入。它和你放Python 3的位置在前或者在后没有关系,都可以同样很好地起作用:

>>> try:
...     from io import StringIO
... except ImportError:
...     from cStringIO import StringIO

这个表格包含除了另外列出表格的urllib、urllib2 和urlparse重组外的所有标准库的重命名和重组:

Python 2 名字 Python 3 名字 six名字
anydbm dbm
BaseHTTPServer http.server BaseHTTPServer
__builtin__ builtins builtins
CGIHTTPServer http.server CGIHTTPServer
ConfigParser configparser configparser
copy_reg copyreg copyreg
cPickle pickle cPickle
cProfile profile
cStringIO.StringIO io.StringIO cStringIO
Cookie http.cookies http_cookies
cookielib http.cookiejar http_cookiejar
dbhash dbm.bsd
dbm dbm.ndbm
dumbdb dbm.dumb
Dialog tkinter.dialog tkinter_dialog
DocXMLRPCServer xmlrpc.server
FileDialog tkinter.FileDialog tkinter_filedialog
FixTk tkinter._fix
gdbm dbm.gnu
htmlentitydefs html.entities html_entities
HTMLParser html.parser html_parser
httplib http.client http_client
markupbase _markupbase
Queue queue queue
repr reprlib reprlib
robotparser urllib.robotparser urllib_robotparser
ScrolledText tkinter.scolledtext tkinter_scrolledtext
SimpleDialog tkinter.simpledialog tkinter_simpledialog
SimpleHTTPServer http.server SimpleHTTPServer
SimpleXMLRPCServer xmlrpc.server
StringIO.StringIO io.StringIO
SocketServer socketserver socketserver
test.test_support test.support tkinter
Tkinter tkinter tkinter
Tix tkinter.tix tkinter_tix
Tkconstants tkinter.constants tkinter_constants
tkColorChooser tkinter.colorchooser tkinter_colorchooser
tkCommonDialog tkinter.commondialog tkinter_commondialog
Tkdnd tkinter.dnd tkinter_dnd
tkFileDialog tkinter.filedialog tkinter_tkfiledialog
tkFont tkinter.font tkinter_font
tkMessageBox tkinter.messagebox tkinter_messagebox
tkSimpleDialog tkinter.simpledialog tkinter_tksimpledialog
turtle tkinter.turtle
UserList collections
UserString collections
whichdb dbm
_winreg winreg winreg
xmlrpclib xmlrpc.client

urllib、urllib2和urlparse

urllib、urllib2和urlparse这三个模块被重组进了urllib.request、urllib.parse和urllib.error这三个新的模块。因为没有six的支持,所有你必须要使用前面提到的try/except技巧。

Python 2 名字 移动到
urllib._urlopener urllib.request
urllib.ContentTooShortError urllib.error
urllib.FancyURLOpener urllib.request
urllib.pathname2url urllib.request
urllib.quote urllib.parse
urllib.quote_plus urllib.parse
urllib.splitattr urllib.parse
urllib.splithost urllib.parse
urllib.splitnport urllib.parse
urllib.splitpasswd urllib.parse
urllib.splitport urllib.parse
urllib.splitquery urllib.parse
urllib.splittag urllib.parse
urllib.splittype urllib.parse
urllib.splituser urllib.parse
urllib.splitvalue urllib.parse
urllib.unquote urllib.parse
urllib.unquote_plus urllib.parse
urllib.urlcleanup urllib.request
urllib.urlencode urllib.parse
urllib.urlopen urllib.request
urllib.URLOpener urllib.request
urllib.urlretrieve urllib.request
urllib2.AbstractBasicAuthHandler urllib.request
urllib2.AbstractDigestAuthHandler urllib.request
urllib2.BaseHandler urllib.request
urllib2.build_opener urllib.request
urllib2.CacheFTPHandler urllib.request
urllib2.FileHandler urllib.request
urllib2.FTPHandler urllib.request
urllib2.HTTPBasicAuthHandler urllib.request
urllib2.HTTPCookieProcessor urllib.request
urllib2.HTTPDefaultErrorHandler urllib.request
urllib2.HTTPDigestAuthHandler urllib.request
urllib2.HTTPError urllib.request
urllib2.HTTPHandler urllib.request
urllib2.HTTPPasswordMgr urllib.request
urllib2.HTTPPasswordMgrWithDefaultRealm urllib.request
urllib2.HTTPRedirectHandler urllib.request
urllib2.HTTPSHandler urllib.request
urllib2.install_opener urllib.request
urllib2.OpenerDirector urllib.request
urllib2.ProxyBasicAuthHandler urllib.request
urllib2.ProxyDigestAuthHandler urllib.request
urllib2.ProxyHandler urllib.request
urllib2.Request urllib.request
urllib2.UnknownHandler urllib.request
urllib2.URLError urllib.request
urllib2.urlopen urllib.request
urlparse.parse_qs urllib.parse
urlparse.parse_qsl urllib.parse
urlparse.urldefrag urllib.parse
urlparse.urljoin urllib.parse
urlparse.urlparse urllib.parse
urlparse.urlsplit urllib.parse
urlparse.urlunparse urllib.parse
urlparse.urlunsplit urllib.parse

移除的模块

一些标准库模块已经被丢弃。UserDict是一个,但这些类中的一部分有一些差不多的替代品,但不是完全的兼容。更多信息见

取代UserDict

大多数其他被丢弃的模块都是些已经被替换掉很长久的模块,或者是一些给支持时期不长的特殊平台的模块。这个规则适用并例外的是异常模块。它包含异常的等级,但所有它们也是内置的,所以你从来都不需要从异常模块导入任何东西。因此它已经在Python 3被完全移除了。

除了给Solaris、RIX和Mac OS 9的特殊模块,在Python 3中被移除模块列表:

模块名 注释
audiodev
Bastion
bsddb185 被bsddb3替代
bsddb3 在CheeseShop可用
Canvas
cfmfile
cl
commands
compiler
dircache
dl 被ctypes替代
exception 见前面
fpformat
htmllib 被html.parser替代
ihooks
imageop
imputil
linuxaudiodev 被ossaudiodev替代
md5 被hashlib替代
mhlib
mimetools 被email替代
MimeWriter 被email替代
mimify 被email替代
multifile 被email替代
mutex
new
popen2 被subprocess替代
posixfile
pure
rexec
rfc822 被email替代
sha 被hashlib替代
sgmllib
sre 被re替代
stat 被os.stat()替代
stringold
sunaudio
sv
test.testall
thread 被threading替代
timing
toaiff
user

被移动的内置函数

有几个内置函数被移到了标准库。你可以用相似的方式来处理他们,通过偿试从Python 3的位置导入他们并在失败时不做任何事:

>>> try:
...     from imp import reload
... except ImportError:
...     pass

被移动的内置函数是:

Python 2 名 Python 3 名 six 名
intern() sys.intern()
reduce() functools.reduce() reduce
reload() imp.reload() reload_module

string模块调动

有几个函数存在于string模块,同时也作为str类型及实体的方法存在。这些现在已经被从string模块移除。你还可以在字符串实体或者从str类型中使用他们。所以在Python 2可以写成:

>>> import string
>>> string.upper('Dinsdale!')
'DINSDALE!'

现在需要被写成下面两种方式中的一个:

>>> 'Dinsdale!'.upper()
'DINSDALE!'
>>> str.upper('Dinsdale!')
'DINSDALE!'

第一种方式是做这个最常见的一个,但是换成第二个方式可以做简单的查找和替换。

被移除的函数是capitalize()、 center()、 count()、expandtabs()、 find()、index()、 join()、ljust()、lower()、lstrip()、maketrans()、 replace()、 rfind()、rindex()、 rjust()、rsplit()、rstrip()、split()、strip()、swapcase()、translate()、upper()及 zfill()。

此外atof()、atoi()和atol()函数被移除,并且被把字符串值变成浮点和整数的构造器取代。因为这些函数从Python 2.0起就废弃了,也极不像你会实际使用它们的样子。

函数及方法属性的重命名

在函数和方法中的很多特殊属性是在决定Python应该用“双下划线”方法来描述被Python使用名前就被命名了。

如果你不使用2ot3处理这个的最简单方法是要根据Python版本用属性史定义一个变量并使用getattr来访问属性。然而,这个不能在im_class重命名的情况下的起作用,所以你需要一个函数来取得结果:

>>> import sys
>>> if sys.version_info < (3,):
...     defaults_attr = 'func_defaults'
...     get_method_class = lambda x: x.im_class
... else:
...     defaults_attr = '__defaults__'
...     get_method_class = lambda x: x.__self__.__class__
>>> class Test(object):
...     def hasdefaults(a=1, b=2):
...         pass
>>> method = Test().hasdefaults
>>> getattr(method, defaults_attr)
(1, 2)
>>> get_method_class(method)
<class 'Test'>

Six已经定义了函数来重新得到最常见的属性名:

Python 2 名 Python 3 名 six 函数
func_closure __closure__
func_doc __doc__
func_globals __globals__
func_name __name__
func_defaults __defaults__ get_function_defaults()
func_code __code__ get_function_code()
func_dict __dict__
im_func __func__ get_method_function()
im_self __self__ get_method_self()
im_class __self__.__class__



版权声明:本文为dhl11原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。