22.1. 升级 Python 2.x 到 3.x 版本须知
本部分包含有关从 Python2 更新到 Python3 的注释和技巧,包括每个模块中更改的摘要和参考。
参考
本部分中的注释基于Python开发团队和版本管理器针对每个发行版编写的*新增功能文档。
有关移植到 Python3 的更多信息,请参阅
- 将 Python2代码移植到 Python3在
docs.python.org
上。 - 移植到Python 3,作者Lennart Regebro。
- python-porting邮件列表。
新模块
Python3 包含许多新模块,提供了Python2 中没有的功能。
[asyncio
](pymotw.com/3/asyncio/index.html#mo...“ asyncio:异步I / O,事件循环和并发工具”)
异步I / O,事件循环和其他并发工具
[concurrent.futures
](pymotw.com/3/concurrent.futures/in...“ concurrent.futures:管理并发任务池”)
管理并发任务池
[ensurepip
](pymotw.com/3/ensurepip/index.html#...“ ensurepip:安装Python软件包安装程序,pip”)
安装Python软件包安装程序pip
定义枚举类型
[ipaddress
](pymotw.com/3/ipaddress/index.html#...“ ipaddress:用于处理Internet协议(IP)地址的类。”)
使用Internet协议(IP)地址的类
[pathlib
](pymotw.com/3/pathlib/index.html#mo...“ pathlib:将文件系统路径视为对象。”)
面向对象的 API,用于处理文件系统路径
[选择器
](pymotw.com/3/selectors/index.html#... / O复用抽象”)
I / O 复用抽象
[statistics
](pymotw.com/3/statistics/index.html...“ statistics:统计计算”)
统计计算
[venv
](pymotw.com/3/venv/index.html#modul...“ venv:创建隔离的安装和执行上下文。”)
创建隔离的安装和执行上下文
重命名模块
作为 PEP 3108 的一部分,许多标准库模块在 Python 2和3之间被重命名。所有新模块名称始终使用小写字母,并且其中一些已移入程序包以更好地组织相关模块。通常,仅通过修复 import 语句就可以将使用这些模块的代码更新为可与 Python 3配合使用。重命名的完整列表可以在字典lib2to3.fixes.fix_imports.MAPPING
中找到(键是 Python 2名称,值是 Python 3名称)和下表中。
重命名模块
Python 2名称 | Python 3名称 |
---|---|
__ builtin __ |
builtins |
_winreg |
winreg |
BaseHTTPServer |
[http.server ](pymotw.com/3/http.server/index.htm...“ http.server:用于实现Web服务器的基类。”) |
CGIHTTPServer |
[http.server ](pymotw.com/3/http.server/index.htm...“ http.server:用于实现Web服务器的基类。”) |
命令 |
subprocess |
ConfigParser |
[configparser ](pymotw.com/3/configparser/index.ht...“ configparser:读取/写入类似于Windows INI文件的配置文件”) |
饼干 |
[http.cookies ](pymotw.com/3/http.cookies/index.ht...“ http.cookies:服务器端HTTP cookie工具”) |
cookielib |
http.cookiejar |
copy_reg |
copyreg |
cPickle |
[pickle ](pymotw.com/3/pickle/index.html#mod...“ pickle:对象序列化”) |
cStringIO |
[io ](pymotw.com/3/io/index.html#module-...“ io:实现文件I / O,并提供使用类文件API来处理缓冲区的类。 “) |
dbhash |
dbm.bsd |
dbm |
dbm.ndbm |
对话框 |
tkinter.dialog |
DocXMLRPCServer |
[xmlrpc.server ](pymotw.com/3/xmlrpc.server/index.h...“ xmlrpc.server:实现XML-RPC服务器。”) |
dumbdbm |
dbm.dumb |
FileDialog |
tkinter.filedialog |
gdbm |
dbm.gnu |
htmlentitydefs |
html.entities |
HTMLParser |
html.parser |
httplib |
http.client |
队列 |
队列 |
repr |
reprlib |
robotparser |
[urllib.robotparser ](pymotw.com/3/urllib.robotparser/in...“ urllib.robotparser:Internet蜘蛛访问控制”) |
ScrolledText |
tkinter.scrolledtext |
SimpleDialog |
tkinter.simpledialog |
SimpleHTTPServer |
[http.server ](pymotw.com/3/http.server/index.htm...“ http.server:用于实现Web服务器的基类。”) |
SimpleXMLRPCServer |
[xmlrpc.server ](pymotw.com/3/xmlrpc.server/index.h...“ xmlrpc.server:实现XML-RPC服务器。”) |
SocketServer |
[socketserver ](pymotw.com/3/socketserver/index.ht...“ socketserver:创建网络服务器。”) |
StringIO |
[io ](pymotw.com/3/io/index.html#module-...“ io:实现文件I / O,并提供使用类文件API来处理缓冲区的类。 “) |
提示 |
tkinter.tix |
tkColorChooser |
tkinter.colorchooser |
tkCommonDialog |
tkinter.commondialog |
Tkconstants |
tkinter.constants |
Tkdnd |
tkinter.dnd |
tkFileDialog |
tkinter.filedialog |
tkFont |
tkinter.font |
Tkinter |
tkinter |
tkMessageBox |
tkinter.messagebox |
tkSimpleDialog |
tkinter.simpledialog |
ttk |
tkinter.ttk |
urlparse |
[urllib.parse ](pymotw.com/3/urllib.parse/index.ht...“ urllib.parse:将URL拆分为组件”) |
UserList |
集合 |
UserString |
集合 |
xmlrpclib |
[xmlrpc.client ](pymotw.com/3/xmlrpc.client/index.h...“ xmlrpc.client:XML-RPC的客户端库”) |
也可以看看
-six软件包对于编写可同时在 Python 2和3下运行的代码很有用。特别是six.moves
模块可让您的代码使用单个 import 语句导入重命名的模块,根据 Python 的版本自动将导入重定向到名称的正确版本。
- PEP 3108 –标准库重组
移除模块
这些模块不再存在,或者它们的功能被合并到现有模块中了。
bsddb
bsddb
和 dbm.bsd
模块被移除了。Berkeley DB 的绑定如今在标准库外作为 bsddb3 来维护。
commands
commands
模块从 Python 2.6 开始废弃,在 Python 3.0 中被移除。作为替代,查看 subprocess
。
compiler
compiler
模块被移除,作为替代,查看 ast
。
dircache
dircache
模块被移除,没有替代。
EasyDialogs
EasyDialogs
模块被移除,作为替代,查看 tkinter
。
exceptions
exceptions
模块被移除,由于所有的 exeptions 都可以作为内建类。
htmllib
htmllib
模块被移除,作为替代,查看 html.parser
。
md5
MD5消息摘要算法的实现被移动到了 hashlib
。
mimetools, MimeWriter, mimify, multifile, and rfc822
mimetools
、MimeWriter
、mimify
、multifile
和 rfc822
这些模块被移除,作为替代,查看 email
。
popen2
popen2
模块被移除,作为替代,查看 subprocess
。
posixfile
posixfile
模块被移除,作为替代,查看 io
。
sets
sets
模块在 Python 2.6 中废弃,在 Python 3.0 中被移除。作为替代,使用 set
和 orderedset
。
sha
SHA-1 消息摘要算法被移动到 hashlib
。
sre
sre
模块在 Python 2.5 中废弃,在 Python 3.0 中被移除。作为替代,使用 re
。
statvfs
statvfs
模块在 Python 2.6 中废弃,在 Python 3.0 中被移除。作为替代,使用 os
中的 os.statvfs()
。
thread
thread
模块被移除。作为替代,使用 threading
中的更高级别的 API。
user
user
模块在 Python 2.6 中废弃,在 Python 3.0 中被移除。作为替代,查看 site
模块中提供的用户自定义功能。
废弃模块
这些模块仍然存在于标准库中,但是被废弃,并且不应该用在新的 Python 3 编程中。
asyncore and asynchat
异步 I/O 和协议处理。作为替代,查看 asyncio
。
formatter
通用输出格式和设备接口。查看 Python issue 18716 获取详情。
imp
访问 import 语句的实现。作为替代,查看 importlib
。
optparse
命令行选项解析库。argparse
的 API 类似于 optparse
,并且在很多情况下,argparse
可被用作直接的替代,只需更新用到的类和方法的名称。
模块改动总结
abc
abstractproperty()
、abstractclassmethod()
以及 abstractstaticmethod()
被废弃。作为代替,结合 property()
、classmethod()
以及 staticmethod()
使用 abstractmethod()
: (Python issue 11610).
anydbm
anydbm
在 Python 3 中被改名为 dbm
。
argparse
ArgumentParser
的 version
参数被移除,而使用了 action
方式 (Python issue 13248)。
旧的格式中, version
作为参数。
parser = argparse.ArgumentParser(version='1.0')
新的格式中,需要添加一个明确的参数定义。
parser = argparse.ArgumentParser()
parser.add_argument('--version', action='version',
version='%(prog)s 1.0')
选项名称和版本格式字符串可以被修改,来满足应用的需求。
Ptyhon 3.4 中,版本操作改为 stdout 而不是 stderr 来打印版本字符串: (Python issue 18920)。
array
Python 2 的早期版本中使用的代表字符字节的 'c'
类型被移除。作为替代,,使用 'b'
或者 'B'
。
代表 Unicode 字符串字符的 'u'
类型被废弃,在 Ptyhon 4.0 将被移除。
tostring()
和 fromstring()
函数被命名为 tobytes()
和 frombytes()
来消除歧义:(Python issue 8990)。
atexit
当 atexit
更新为包含一个 C 实现 (Python issue 1680961),一个回退被引入,在错误处理逻辑中,只有异常的概述出现,而没有回溯信息。Python 3.3 中修正了这个情况 (Python issue 18776)。
base64
encodestring()
和 decodestring()
改名为 encodebytes()
和 decodebytes()
旧的名字依然可以作为别名使用,但是被废弃了: (Python issue 3613)。
两个使用85字符字母表新的编码函数被添加。b85encode()
实现了用于 Mercurial 和 git 中的一个编码,而 a85encode()
实现了用于 PDF 文件 (Python issue 17618) 中的 Ascii85 格式。
bz2
BZ2File
示例现在支持上下文管理器协议,并且不需要被包含在 contextlib.closing()
中。
collections
之前定义在 collections
中的虚拟基类被移动到 collections.abc
,具有 collections
中引入的后向兼容性,查看:(Python issue 11085)。
comands
getoutput()
和 getstatusoutput()
被移动到 subprocess
, commands
被删除。
configparser
ConfigParser
模块被命名为 configparser
。
旧的 ConfigParser
由于 SafeConfigParser
被移除了,现在又被改名为 ConfigParser
。废弃的插入文字操作可用通过 LegacyInterpolation
来实现。
read()
方法如今支持一个 encoding
参数,所以不再需要使用 codecs
来读取含有 Unicode 值的配置文件。
不建议使用 RawConfigParser
。新项目应该使用 ConfigParser(interpolation=None)
来代替,可以得到同样的结果。
contextlib
contextlib.nested()
被移除。作为替代,向 with
语句传多个内容管理器。
csv
替代直接使用读取器的 next()
方法,使用内置的 next()
方法来合理引用 遍历器。
datetime
从 Python 3.3 开始,naive 和时区敏感的 datetime
实例之间的相等性比较,将会返回 False
,而不是 TypeError
(Python issue 15006)。
Python 3.5 之前,一个代表 midnight 的 datetime.time
对象在转换为布尔值时,等价于 False
。这一情况在 Python 3.5 中被移除 (Python issue 13936)。
decimal
Python 3.3 基于 libmpdec
合并了 decimal
的一个 C 实现。这个改变提升了性能,但是相对于纯的 Python 实现,也带来了一些 API 变化,以及操作差别。查看 the Python 3.3 release notes 获取详情。
fractions
from_float()
和 from_decimal()
类方法不再需要。浮点数和 Decimal
值可以直接传给 Fraction
构造器。
gc
DEBUG_OBJECT
和 DEBUG_INSTANCE
标志被移除。不再需要辨别新旧类之间的区别。
gettext
gettext
中的所有翻译函数假定 Unicode 输入和输出,Unicode 变量例如 ugettext()
被移除。
glob
新函数 'escape()' 实现了一种查找名称中包含元字符的文件的方法 (Python issue 8402)。
http.cookies
除了转义引号之外,simplecokie 还在值中编码逗号和分号,以便更好地反映真实浏览器中的行为 (Python issue 9824)。
imaplib
Python 3 版本以下,imaplib
返回 UTF-8 编码的字节字符串。如今支持接受Unicode字符串,并在发送传出命令或作为登录服务器的用户名和密码时自动对其进行编码。
importlib
find_loader()
函数被废弃。作为替代,使用 importlib.util.find_spec()
。
inspect
getargspec()
、getfullargspec()
getargvalues()
、getcallargs()
、getargvalues()
、formatargspec()
以及 formatargvalues()
由于 signature()
被废弃 (Python issue 20438)。
itertools
imap()
、izip()
和 ifilter()
被返回迭代的内置函数版本替代,不再是 list
对象 (map()
、zip()
和 filter:()
)。
ifilterfalse()
改名为 filterfalse()
。
json
json
API 更新为只支持 str
,并且没有 bytes
,因为 JSON 只用 Unicode 进行定义。
locale
UTF-8 编码名称的规范化版本已从 「UTF8」 更改为 「UTF8」,因为 Mac OS X 和 OpenBSD 不支持使用 「UTF8」 (Python issue 10154 和 Python issue 10090)。
logging
logging
模块包含一个 lastResort
logger,如果应用中没有其他日志配置则默认使用。这样就不需要在应用程序中单独配置日志记录,以避免用户在应用程序导入的库使用日志记录而应用程序本身不使用日志记录时看到错误消息。
mailbox
邮箱以二进制模式读取和写入邮箱文件,依赖电子邮件包解析邮件。不推荐使用StringIO和文本文件输入 (Python issue 9124)。
mmap
从读取 APIS 返回的值是字节字符串,在作为文本处理之前需要解码。
operator
div()
函数已被删除。根据所需的语义,使用 floordiv()
或 truediv()
。
repeat()
函数已删除。改为使用 mul()
。
删除了功能 getslice()
,setslice()
和 delslice()
。改为将 getitem()
,setitem()
和 delitem()
与切片索引一起使用。
函数 isCallable()
已被删除。使用抽象基类 collections.Callable
代替。
isinstance(obj, collections.Callable)
类型检查功能 isMappingType()
,isSequenceType()
和 isNumberType()
已被删除。使用来自 collections
或 numbers
代替。
isinstance(obj, collections.Mapping)
isinstance(obj, collections.Sequence)
isinstance(obj, numbers.Number)
sequenceIncludes()
函数已被删除,改为使用 contains()
。
os
popen2()
、popen3()
和 popen4()
已被移除。popen()
仍在但已被弃用并发出警告(如果使用)。使用这些功能的代码应重写为使用 subprocess
,而不是更多可跨操作系统移植。
os.tmpnam()
,os.tempnam()
和 os.tmpfile()
已被删除。改为使用 tempfile
模块。
os.stat_float_times()
被废弃 (Python issue 14711)。
os.unsetenv()
不再忽略错误 (Python issue 13415)。
os.path
os.path.walk()
已被移除,使用 os.walk()
替代。
pdb
print
命令别名已被移除,不再会影响 print()
函数 (Python issue 18764)。保留 p
快捷方式。
pickle
Python 2 中的 pickle 模块的 C 实现已移至新模块,该模块将在可能时自动用于替换 Python 实现。不再需要在 pickle
之前查找 cPickle
的旧导入习惯。
try:
import cPickle as pickle
except:
import pickle
使用 C 实现的自动导入,仅需要直接导入 pickle
模块。
import pickle
针对使用2级或更低版本协议的 pickled 数据,改进了 Python 2.x 和 3.x 之间的互操作性,以解决在过渡到 Python 3 期间重命名大量标准库模块时引入的问题。因为 pickled 数据包括对类、类型名以及改动名的引用,很难在 Python 2 和 3 程序之间交换 pickled 数据。现在,对于使用协议级别2或更旧的协议进行 pickle 的数据,在向 pickle 流中进行写入和读取时,将自动使用类的旧名称。
此行为默认情况下可用,可以使用 fix_imports
选项关闭。此更改可以改善这种情况,但不能完全消除不兼容的情况。特别是在 Python 3.0 下,可能无法读取在 Python 3.1 下被 pickle 的数据。为了确保在 Python 3 应用程序之间具有最大的可移植性,请使用协议级别3,该协议级别不包括此兼容性功能。
默认协议版本已从人类可读的版本 0
更改为 3
(在 Python 3 应用程序之间共享时具有最佳互操作性的二进制格式)。
当回读以创建 Unicode 字符串对象时,由 Python 2.x 应用程序写入 pickle 的字节字符串数据将被解码。转换的编码默认为 ASCII,可以通过将值传递给 Unpickler
进行更改。
pipes
pipes.quote()
已移至 shlex
(Python issue 9723)。
platform
platform.popen()
已被启用,使用 subprocess.popen()
替代 (Python issue 11377)。
platform.uname()
现在返回一个 namedtuple
。
由于Linux发行版没有描述自己的一致方法,获取描述的方法 (platform.dist()
和 platform.linux_distribution()
) 被废弃并且将在 Python 3.7 中移除 (Python issue 1322)。
random
jumpahead()
在 Python 3.0 中被移除。
re
默认为 UNICODE
标志位。要从 Python 2 沿用指定 ASCII,使用 ASCII
标志位。
shelve
shelve
的默认输出格式可以创建一个 .db
扩展名的文件,添加到传给 shelve.open()
的参数上。
signal
PEP 475 表示重试了中断的系统调用,并返回 EINTR
。这会改变信号处理程序和其他系统调用的行为,因为在信号处理程序返回之后,除非信号处理程序引发异常,否则将重试中断的调用。有关完整的详细信息,请参考 PEP 文档。
socket
在 Python 2 中,通常可以直接通过套接字发送 str
对象。因为 str
替换了 unicode
,所以在 Python 3 中必须先对值进行编码,然后再发送。socket
部分中的示例使用字节字符串,这些字符串已被编码。
socketserver
socketserver
在 Python 2中名称为 SocketServer
。
string
string
模块的所有函数,包括 str
对象的方法,都被移除了。
常量 letters
、lowercase
和 uppercase
被移除。名称相似的新常量仅限于 ASCII 字符集。
maketrans()
函数被 str
、bytes
和 bytearray
上的函数代替,以阐明每种翻译表支持的输入类型。
struct
struct.pack()
现在仅在使用 s
字符串包代码时支持字节字符串,并且不再隐式将字符串对象编码为UTF-8 (Python issue 10783)。
subprocess
传给 subprocess.Popen
的 close_fds
参数默认值,不再总是 False
。Unix 下总是默认为 True
。在 Windows 下,如果标准 I/O 流参数设置为 None
,那么默认为 True
,否则默认为 False
。
sys
程序退出是,清除操作不再检查 sys.exitfunc
变量。使用 atexit
替代。
变量 sys.subversion
不再定义。
标志位 sys.flags.py3k_warning
、sys.flags.division_warning
、sys.flags.division_new
、sys.flags.tabcheck
和 sys.flags.unicode
不再定义。
变量 sys.maxint
不再定义。使用 sys.maxsize
替代。查看 PEP 237 (Unifying Long Integers and Integers).
全局异常跟踪变量 sys.exc_type
、sys.exc_value
和 sys.exc_traceback
被移除。函数 sys.exc_clear()
也被移除。
变量 sys.version_info
现在是一个 :pynamedtuple
实例,具有 major
、minor
、micro
、releaselevel
和 serial
属性 (Python issue 4285)。
检查间隔功能,控制允许线程上下文切换之前执行的操作码数已被替换为绝对时间值,由 sys.setswitchinterval()
管理。已弃用用于管理检查间隔的旧函数 sys.getcheckinterval()
和 sys.setcheckinterval()
。
现在,sys.meta_path
和 sys.path_hooks
变量公开了所有导入模块的路径查找器和入口钩子。在早期版本中,仅公开显式添加到路径的查找器和钩子,并且 C 导入在其实现中使用了无法从外部修改的值。
对于 Linux 系统,sys.platform
不再包含版本号。现在的值只是 linux
而不是 linux2
活 linux3
。
threading
弃用 thread
模块,使用 threading
中的 API。
threading
的调试功能包括从 APIs (Python issue 13550) 中移除掉的 verbose
变量。
threading
的较旧的实现将工厂函数用于某些类,因为它们在 C 中作为扩展类型实现,因此不能被子类化。语言的限制已被消除,许多旧的工厂函数已转换为允许子类化的标准类 (Python issue 10968)。
从 threading
导出的公共符号已重命名为 PEP 8 兼容。保留旧名称是为了向后兼容,但在将来的版本中将删除它们。
time
time.asctime()
和 time.ctime()
已重新实现为不使用同一时间的系统功能以允许使用更长的时间。time.ctime()
现在支持从1900到 maxint
的年份,尽管对于大于 9999
的值,输出字符串长于标准的24个字符,以允许多余的年份数字 (Python issue 8013)。
单元测试
不推荐使用以 「fail」 开头的 TestCase
方法 (failIf()
,failUnless()
等)。请改用 assert 方法的替代形式。
不推荐使用几种较旧的方法别名,并用首选名称代替。使用不推荐使用的名称会产生警告 (Python issue 9424)。有关旧名称与新名称之间的映射,请参见下表。
Deprecated unittest.TestCase Methods
弃用名称 | 推荐名称 |
---|---|
assert_() |
assertTrue() |
assertEquals() |
assertEqual() |
assertNotEquals() |
assertNotEqual() |
assertAlmostEquals() |
assertAlmostEqual() |
assertNotAlmostEquals() |
assertNotAlmostEqual() |
UserDict, UserList, and UserString
UserDict、UserList 和 UserString 类已从其各自的模块移除到 collections
模块。可以直接将 dict
、list
和 str
子类化,但是 collections
中的类可以简化子类的实现,因为容器的内容可以直接通过实例属性获得。collections.abc
中的抽象类对于创建遵循内置类型的 API 的自定义容器也很有用。
uuid
uuid.getnode()
现在使用 PATH
环境变量来查找可以报告 UNIX 下主机 MAC 地址的程序 (Python issue 19855)。如果在搜索路径上未找到程序,则回退到 /sbin
和 /usr/sbin
中。这个搜索行为可能会产生不同的结果,相对于早期的 Python 版本,如果是使用类似 netstat
、ifconfig
、ip
和 arp
的话。
whichdb
whichdb
的功能已移至 dbm
模块。
xml.etree.ElementTree
XMLTreeBuilder
已重命名为 TreeBuilder
并且 API 进行了几处更改。
ElementTree.getchildren()
被弃用,使用 list(elem)
建立子级列表。
ElementTree.getiterator()
被弃用,使用 iter()
代替常规迭代器协议来创建迭代器。
解析失败是,不是引发 xml.parsers.expat.ExpatError
,XMLParser
现在引发 xml.etree.ElementTree.ParseError
。
zipimport
从 get_data()
返回的数据是一个字节字符串,需要先解码才能用作 Unicode 字符串。
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。