跳转到主要内容

使用six模块为Python 2应用程序添加Python 3支持。

项目描述

No Maintenance Intended

六者是一个工具,可以将Python 3支持添加到Python 2项目中。它被编写来生成将OpenStack移植到Python 3的补丁。它专注于支持Python 2.7和3.4。

它使用基本的正则表达式来查找需要修改的代码。如果代码没有被修补或看起来可疑,它会发出警告。

另请参阅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() + list2dict.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 的资源

变更日志

  • 版本 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 被替换为 0xff0600l 被替换为 0o600

    • except 现在也处理带有点号的异常(例如:except select.error, exc:

    • iterkeys 现在用 for key in dict: 替换 for key in dict.iterkeys(): 以避免使用 six。

    • 增强 exceptraise 正则表达式,以匹配逗号后面没有空格的表达式

  • 版本 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)

    • 添加新的 dict0dict_addexcept 操作。

    • 添加 –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.urlparseimport urllib2)现在被替换为 urllib.parse.urlparsefrom 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 (32.1 kB 查看哈希值)

上传时间 源代码

构建分发

sixer-1.6.1-py3-none-any.whl (20.9 kB 查看哈希值)

上传时间 Python 3

由支持