使用six模块为Python 2应用程序添加Python 3支持。
项目描述
六者是一个工具,可以将Python 3支持添加到Python 2项目中。它被编写来生成将OpenStack移植到Python 3的补丁。它专注于支持Python 2.7和3.4。
它使用基本的正则表达式来查找需要修改的代码。如果代码没有被修补或看起来可疑,它会发出警告。
Sixer项目在Github上(源代码,错误跟踪器)
另请参阅six模块文档。
用法
sixer.py [--write] [options] <all|operation1[,operation2,...]> <directories or filenames>
sixer.py显示已修补文件的名称。对于可能需要手动移植的可疑代码,它会显示警告。
第一个参数可以是一个由逗号分隔的操作列表。使用"all"来应用所有操作。以-为前缀的操作将被排除。例如,"all,-iteritems"将应用所有操作,除了iteritems。
对于目录,sixer.py在所有子目录中搜索.py文件。
默认情况下,sixer使用dry run:文件不会被修改。添加--write(或-w)选项来就地修改文件。最好在由源代码管理器(例如git)管理的项目中使用sixer来查看差异并撤销不希望的变化。原始文件不会被保留。
使用--help查看所有可用选项。
以下为可用操作的列表。
操作
全部:
将所有操作合并在一起
basestring:
将 basestring 替换为 six.string_types,并添加 import six
dict0:
将 dict.keys()[0] 替换为 list(dict.keys())[0]
同样适用于 dict.values()[0] 和 dict.items()[0]
注意:该模式匹配任何整数索引,而不仅仅是 0
dict_add:
将 dict.keys() + list2 替换为 list(dict.keys()) + list2
同样适用于 dict.values() + list2 和 dict.items() + list2
except:
将 except ValueError, exc: 替换为 except ValueError as exc:
将 except (TypeError, ValueError), exc: 替换为 except (TypeError, ValueError) as exc:
has_key:
将 dict.has_key(key) 替换为 key in dict
iteritems:
将 dict.iteritems() 替换为 six.iteritems(dict),并添加 import six
itervalues:
将 dict.itervalues() 替换为 six.itervalues(dict),并添加 import six
iterkeys:
将 for key in dict.iterkeys(): 替换为 for key in dict:
将 dict.iterkeys() 替换为 six.iterkeys(dict),并添加 import six
itertools:
将 itertools.ifilter 替换为 six.moves.filter,并添加 import six
对 itertools 模块中的 ifilterfalse()、imap()、izip() 和 izip_longest() 进行类似的修改
long:
将 123L 替换为 123(十进制)
将 0xABl 替换为 0xAB(十六进制)
将 0600L 替换为 0o600(八进制)
将 (int, long) 替换为 six.integer_types
将 long(1) 替换为 1
next:
将 iter.next() 替换为 next(iter)
print:
将 print msg 替换为 print(msg)
将 print msg, 替换为 print(msg, end=' ') 并添加 from __future__ import print_function 导入
将 print 替换为 print() 并添加 from __future__ import print_function 导入
将 print >>sys.stderr, "hello" 替换为 print("hello", file=sys.stderr) 并添加 from __future__ import print_function 导入
raise:
将 raise exc[0], exc[1], exc[2] 替换为 six.reraise(*exc),并添加 import six
将 raise exc_type, exc_value, exc_tb 替换为 six.reraise(exc_type, exc_value, exc_tb),并添加 import six
将 raise exc, msg 替换为 raise exc(msg),并添加 import six
six_moves:
将 Python 2 的导入替换为 six.moves 的导入,并添加 import six。Python 2 模块
BaseHTTPServer
ConfigParser
Cookie
HTMLParser
队列
SimpleHTTPServer
SimpleXMLRPCServer
__builtin__
cPickle
cookielib
htmlentitydefs
httplib
repr
xmlrpclib
将 Python 2 函数替换为 six.moves.<function>,添加 import six。Python 2 函数
raw_input()
reduce()
reload()
将 unichr() 替换为 six.unichr(),添加 import six
string:
将 string.xxx(str, ...) 替换为 str.xxx(...),其中 .xxx 是一个字符串方法。例如,将 string.upper("abc") 替换为 "abc".upper()。
将 string.atof(str) 替换为 float(str)
将 string.atoi(str) 和 string.atol(str) 替换为 int(str)
stringio:
将 StringIO.StringIO 替换为 six.StringIO,添加 import six
将 cStringIO.StringIO 替换为 moves.cStringIO,添加 from six import moves
将 from StringIO import StringIO 替换为 from six import StringIO
将 from cStringIO import StringIO 替换为 from six.moves import cStringIO as StringIO
在 Python 3 中需要字节时,可能需要将其替换为 six.BytesIO(或 io.BytesIO,如果您不支持 Python 2.6)
unicode:
将 unicode 替换为 six.text_type,添加 import six
将 (str, unicode) 替换为 six.string_types,添加 import six
urllib:
将 Python 2 urllib 和 urllib2 替换为 six.moves.urllib,添加 import six
xrange:
将 xrange() 替换为 range() 并添加 from six.moves import range
如果所有范围都小于或等于 1024 个项目,则不需要添加导入
安装
要安装 sixer,请输入
pip3 install sixer
sixer 需要 Python 3,它不适用于 Python 2。
添加 six 导入
当操作使用 six 时,可以添加 import six。sixer 遵守 OpenStack 编码风格规则添加导入:按标准库、第三方和应用程序导入分组;导入必须排序。
限制
由于该项目是用正则表达式实现的,因此可能会产生假阳性(无效更改)。例如,某些操作在字符串、注释或函数名中替换模式,即使这没有意义。
还可以尝试 2to6 项目,它可能更可靠。
测试
要运行测试,请输入 tox。输入 pip install -U tox 以安装或更新 tox 程序。
或手动运行测试:输入 python3 tests.py。
将代码移植到 Python 3 的资源
Python 3 移植书籍:[语言差异和工作方法](http://python3porting.com/differences.html)(不跟踪链接)
变更日志
版本 1.6.1 (2018-10-24)
项目主页已移动到:[https://github.com/vstinner/sixer](https://github.com/vstinner/sixer)(不跟踪链接)
版本 1.6 (2016-07-25)
dict0 现在也匹配任何整数索引,而不仅仅是 0
long 现在也用 1 替换了 long(1)
版本 1.5 (2016-05-30)
在 six_moves 中,用 configparser.ConfigParser 替换 ConfigParser.ConfigParser,而不是 configparser.configparser
移除八进制操作,因为它会产生太多误报
版本 1.4 (2016-03-11)
在最终总结中显示应用的运算名称
问题 #4:不要在 six.next() 上发出警告
版本 1.3 (2016-02-11)
添加 string 运算。例如,用 string.upper("abc") 替换 "abc".upper()。
print 现在也用 print >>sys.stderr, "hello" 替换 print("hello", file=sys.stderr)
版本 1.2 (2015-11-26)
添加八进制操作:用 0o123 替换 0123
添加 print 操作:用 print(msg) 替换 print msg,同时处理其他打印语句(但还不是所有的)
添加 has_key 操作:用 key in dict 替换 dict.has_key(key)
long 现在也处理八进制和十六进制数字。例如,0xffL 被替换为 0xff,0600l 被替换为 0o600。
except 现在也处理带有点号的异常(例如:except select.error, exc:)
iterkeys 现在用 for key in dict: 替换 for key in dict.iterkeys(): 以避免使用 six。
增强 except 和 raise 正则表达式,以匹配逗号后面没有空格的表达式
版本 1.1 (2015-10-22)
添加命令行选项 --third-party
如果找不到添加导入的最佳位置,则发出警告而不是出错
修复检测第三方模块的代码,不要检查前缀,而要检查全名(例如,如果只知道“numpy”,则“numpypy”不会被检测为第三方模块)
版本 1.0 (2015-10-16)
sixer 不会默认修改文件。添加 --write 来真正就地修改文件。
long 操作现在也用 six.integer_types 替换 (int, long)
itertools 现在也用 ifilterfalse()、izip() 和 izip_longest() 替换 itertools 模块的相应函数
six_moves 现在也用 six.unichr(ch) 替换 unichr(ch)
命令行:现在可以使用 - 前缀排除操作。例如,all,-iteritems 应用所有操作,除了 iteritems。
版本 0.8 (2015-10-03)
urllib 在遇到未知符号时发出警告,而不是抛出异常
将警告写入 stderr,而不是 stdout。如果文件不存在或目录不包含任何 .py 文件,则退出错误代码 1
unicode 操作也用 six.string_types 替换 (str, unicode)
当删除导入时,如果空行后面紧跟着第二个导入,不要删除该空行。
long 也可以替换 1l (长整型数字的 lowercase L 后缀)。
版本 0.7(2015-09-29)
添加新的 dict0,dict_add 和 except 操作。
添加 –app 命令行选项,用于指定应用程序的 Python 模块,以帮助排序导入。
添加新导入的代码遵循更好的 OpenStack 编码风格。例如,它在导入后添加两个空行,而不是一行。
显示修改文件的操作名称。
在警告中显示操作名称。
six_moves 现在也修复了 reduce() 和 reload()。例如,reduce() 被替换为 six.moves.reduce()。
six_moves 现在也修复了 mock.patch()。例如,with mock.patch('__builtin__.open'): ... 被替换为 with mock.patch('six.moves.builtin.open'): ...
urllib 现在也替换了 from ... import ... 导入。例如,from urllib import quote 被替换为 from six.moves.urllib.parse import quote。
版本 0.6(2015-09-11)
添加 “itertools” 操作。
修复 xrange() 正则表达式,不修改 “from six.moves import xrange” 和 “moves.xrange(n)”。
修复 urllib,使其从 urllib2 模块获取 urllib 或 urlparse 模块。例如,urllib2.urlparse.urlparse(import urllib2)现在被替换为 urllib.parse.urlparse(from six.moves import urllib)。
版本 0.5(2015-07-08)
six_moves:支持 “import module as name” 语法并添加 cPickle 模块。
添加 –to-stdout,–quiet 和 –max-range 命令行选项。
如果目录不包含任何 .py 文件或路径不存在,发出警告。
也直接测试 sixer.py 程序。
版本 0.4(2015-06-09)
sixer.py 现在接受命令行上的多个文件名,但操作变为第一个命令行参数。
stringio 操作现在也替换 cStringIO 和 from StringIO import StringIO。
urllib:替换 urlparse.symbol。
six_moves:支持更多模块:Cookie、HTMLParser、SimpleHTTPServer、cookielib、xmlrpclib 等。
将操作重构为类以清理代码。
版本 0.3.1(2015-05-27)
修复 “all” 操作。
six_moves 现在知道更多模块。
urllib:添加 pathname2url,不要修改 urllib2.parse_http_list()。
版本 0.3(2015-05-27)
第一个命令行参数现在可以是文件名。
添加 “all”、“basestring”、“iterkeys”、“six_moves”、“stringio” 和 “urllib” 操作。
增强模块知识表(stdlib、第三方、应用程序)。
在添加导入时忽略无法解析的导入行。
版本 0.2(2015-05-12)
第一个公开版本。
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。
源代码分发
构建分发
sixer-1.6.1.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | a13851e7d1b8fc092ec3b3e7d82b26363258167988f0727b60da1a28162b5764 |
|
MD5 | 797d5d75c8f216e81e5f2a6327b11545 |
|
BLAKE2b-256 | 4b4371b041052c8d80e86d3ca7daef51a64424e89cd75342d49f6bb92c928c44 |
sixer-1.6.1-py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 4ede6fc7bda1c9034fa87bd356f3316b9b67c9ed2043f5fe502a43b45e16500e |
|
MD5 | f7998565663153880a2eb37b51158f44 |
|
BLAKE2b-256 | ecf28fc2ea6a3fcdbc63f14f2eaba1da8f632cae8d06efaed660e39adffd500e |