移植到 Python 3

简介

Twisted 目前仅支持 Python 3.6+。本文档介绍将代码移植到 Python 3 时 Twisted 特定的问题。

API 差异

twisted.python.failure

Failure.trap 在 Python 2 中会引发自身(即 Failure)。在 Python 3 中,将重新引发包装的异常。

字节字符串和文本字符串

在 Python 2 中接受或生成字节字符串(str 的实例,有时称为 字节)的几个 API 在 Python 3 中已更改为接受或生成文本字符串(str 的实例,有时称为 文本unicode)。

twisted.internet.address 中,IPv4AddressIPv6Address 类有两个属性已从字节字符串更改为文本字符串:typehost

twisted.python.log 已从字节字符串大幅转向文本字符串。日志事件,特别是通过类似 msg("foo") 的调用生成的事件,现在必须是文本字符串。因此,在 Python 3 中,传递给日志观察者的事件字典将包含文本字符串,而以前包含字节字符串。

twisted.python.runtime.platformTypetwisted.python.runtime.Platform.getType 的返回值现在都是文本字符串。

twisted.python.filepath.FilePath 没有改变。它只支持字节字符串。这可能需要应用程序更新它们对 FilePath 的使用,至少要传递显式的字节字符串字面量,而不是“原生”字符串字面量(在 Python 3 中是文本)。

reactor.addSystemEventTrigger 中以前是字节字符串的参数现在是原生字符串。

twisted.names.dns 处理具有多种含义的字符串,每个 DNS 记录类型通常有多种含义。这些字符串中的大多数仍然是字节字符串,这可能需要应用程序更新(如上文 FilePath 部分中所述)。不过,一些字符串已更改为文本字符串。任何表示人类可读地址的字符串(例如,Record_Aaddress 参数)现在都是文本字符串。此外,作为字符串给出的生存时间 (ttl) 值现在必须作为文本字符串给出。

twisted.web.resource.IResource 继续将 URL 和所有从 URL 派生的值视为字节字符串。

twisted.web.resource.ErrorPage 有几个字符串属性(templatebriefdetail),这些属性以前是字节字符串。在 Python 3 中,这些属性现在必须是文本字符串。