文档章节

Supporting Python 3(支持python3)——重组和重命名

在湖闻樟
 在湖闻樟
发布于 2015/12/02 12:07
字数 1658
阅读 622
收藏 3

重组和重命名

标准库

为了一致性和使用起来更容易,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__

附注:

[1] http://www.python.org/dev/peps/pep-0008/
[2] http://pypi.python.org/pypi/six


本文地址:http://my.oschina.net/soarwilldo/blog/538255

在湖闻樟注:

原文http://python3porting.com/stdlib.html

引导页Supporting Python 3:(支持Python3):深入指南

目录Supporting Python 3(支持Python 3)——目录

© 著作权归作者所有

在湖闻樟
粉丝 17
博文 72
码字总数 68653
作品 0
深圳
程序员
私信 提问
Supporting Python 3——不使用2to3转换支持Python 2和Python 3

不使用2to3转换支持Python 2和Python 3 虽然Python 3的官方文档努阴人们写同时支持Python 2和Python 3的代码,但是在一此情况这是合适的。尤其是你不能放弃支持Python 2.5及更早的版本时,因...

在湖闻樟
2015/10/28
0
0
Supporting Python 3(支持python3)——语言区别和暂时解决方法

语言区别和暂时解决方法 这个附录包含一个Python 2和Python 3的不同之处列表以及能不用2to3转换同时在Python 2和Python 3下运行的示例代码。 这个列表是不完整的。在这里列出的只有不包括bug...

在湖闻樟
2015/11/20
0
0
Supporting Python 3(支持python3)——序

序 当我在2002年6月加入python-dev邮件列表时,“Python 3000"(在湖闻樟译注:即Python 3)的团队每隔几个月都会描述一个Python 开发团队希望他们实现的建议,但是因为兼容性的原因都没有办...

在湖闻樟
2015/09/01
0
0
Supporting Python 3——迁移python2的c扩展到python3

迁移C扩展 Python 3有很多在C语言API上的变化,包括在API中定义类和初妈化的模块。这意味着每一个C扩展为了能在Python 3 下运行需要进行修改。一些变化很简单而另一些不简单,但是因为2to3只...

在湖闻樟
2015/04/14
0
1
Supporting Python 3(支持Python 3)——目录

Supporting Python 3(支持Python 3) 关于本书 关于术语 序 欢迎来到Python 3 是时候了吗? 如果我现在不能切换会怎么样? Python 和它的版本 更多资源 迁移策略 仅支持Python 3 Python 2和P...

在湖闻樟
2015/09/19
177
0

没有更多内容

加载失败,请刷新页面

加载更多

所以说这才是Redis进化史吗?看Redis是如何变成最强缓存的

写在前面:笔者翻阅了很多资料,只能找到Redis2.2及以后的主要版本的发布日志。所以,让我们从2.2开始一步一步深入了解Redis。 2.2 redis-cli命令非常大的改进: Tab补全,支持help(例如help ...

Java干货分享
45分钟前
2
0
manjaro抽风,/usr/lib/modules目录丢失

现象 2019年6月16日这周,突然发现manjaro抽风: 先是启动时无法加载一些内核模块,导致启动失败 然后用启动盘重新pacman -S linux,第一次启动是好的,再启动就有问题了 原因 翻来覆去搞不定...

chuqq
50分钟前
5
0
MyClouds-2.0-RC 发布,企业级微服务平台

MyClouds企业级微服务平台 MyClouds-V2.0-RC 已发布。 更新如下 [优化] 重构了系统架构。(移除myclouds-admin-webserver工程,停用后端thymeleaf模版引擎,前后端彻底分离;移除了myclouds-...

xiongchun
52分钟前
1
0
Wine-Staging 4.9 发布,增添一些新补丁

Wine-Staging的工作还在继续,到4.9版为止,在上游Wine代码库上有超过830个补丁。 在上周五的Wine 4.9发布之后,Wine-Staging 4.9已经发布了,之前的一些暂存工作现在围绕Windows编解码器和D...

linuxCool
57分钟前
1
0
JAVA8新特性(吐血整理)

一、Java 8 Lambda 表达式 Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。 Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。 使用Lambda 表达式可以...

天王盖地虎626
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部