python3编译器不同版本差别大吗_Python到python的编译器允许你在老版本中使用Python 3.6的一些功能...

Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。

Py-backwards

Python到python的编译器允许你在老版本中使用Python 3.6的一些功能,你可以通过这个在线样例(https://py-backwards.herokuapp.com/)试用它。

需要Python 3.3+ 来运行,可以向下编译至Python 2.7。

支持的特性

目标 3.5:格式化字符串常量:如 f'hi {x}' (https://docs.python.org/3/whatsnew/3.6.html#pep-498-formatted-string-literals)

变量注释:如 x: int = 10 和 x: int (https://docs.python.org/3/whatsnew/3.6.html#whatsnew36-pep526)

数字常量中的下划线:如 1_000_000(自动进行) (https://docs.python.org/3/whatsnew/3.6.html#pep-515-underscores-in-numeric-literals)

目标 3.4:带星标的(元组)解包:如 [*range(1, 5), *range(10, 15)] 和 print(*[1, 2], 3, *[4, 5]) (https://docs.python.org/3/whatsnew/3.5.html#pep-448-additional-unpacking-generalizations)

字典解包:如 {1: 2, **{3: 4}} (https://docs.python.org/3/whatsnew/3.5.html#pep-448-additional-unpacking-generalizations)

目标 3.3:导入pathlib2而不是pathlib (https://pypi.python.org/pypi/pathlib2/)

目标 3.2:yield from (https://docs.python.org/3/whatsnew/3.3.html#pep-380)

return from generator (https://docs.python.org/3/whatsnew/3.3.html#pep-380)

目标 2.7:函数注释:如 def fn(a: int) -> str (https://www.python.org/dev/peps/pep-3107/)

从__future__导入 (https://docs.python.org/3/howto/pyporting.html#prevent-compatibility-regressions)

无参数的super (https://www.python.org/dev/peps/pep-3135/)

无基类的类:如 class A: pass

从 six moves 导入 (https://pythonhosted.org/six/#module-six.moves)

元类

举个例子,如果你有一些python 3.6的代码,如下:

763ecf9e6fd440abbd33c37c5400ca7a.png

你可以用以下命令把它编译成Python2.7:

a125d4a1bb5448e6b2a346c7c93f0e63.png

得到了一些丑丑的代码,但是它确实可用:

b5a87ecabeeb4c53aafef9adb867383e.png

用法

安装:

511d8a2cf9984d0080ab5b5c6c775e66.png

编译代码:

104606af271e4e97876860fb957bc609.png

为了用支持的每一个python版本测试编译好的代码, 你可以使用tox(https://tox.readthedocs.io/en/latest/)和tox-py-backwards(https://github.com/nvbn/tox-py-backwards)。你需要安装它们:

10bb2a5cfa334fbc990e93469f1a5a92.png

填写tox.ini(在testenv部分,设置py_backwards = true来启用py-backwards), 如下:

38565b14628f47f4a6f0fe7b7bb02c30.png

用tox运行测试:

15d68bfd469a40de8b287d549b9e7041.png

开发

设置:

e1aee571e9b24b008d5277a02a7260eb.png

运行测试:

1c596038c85a498aa0af684c65a73d4e.png

在没有docker的系统上运行测试:

3140ef0979ae476d9403655b38c62e7b.png

来写代码转换器

首先,你需要继承 BaseTransformer, BaseNodeTransformer(如果你想使用NodeTransformer(https://docs.python.org/3/library/ast.html#ast.NodeTransformer) 接口的话),或者 BaseImportRewrite(如果你只想去改变导入的话)。

如果你要使用BaseTransformer的话,重写类方法def transform(cls, tree: ast.AST) -> TransformationResult,如下:

a71bc258fef043f08a196edffa9ed549.png

如果你要使用BaseNodeTransformer的话, 重写visit_*方法,为简化起见,这个类在self._tree中有完整的树结构。 如果这个树被修改,你也应该设置self._tree_changed = True:

6a5ece63d460476fad48c59110e4f132.png

如果你要使用BaseImportRewrite的话,只重写rewrites就可以了,如下:

ec82a05150634907beae8e300f081345.png

之后,你需要把你的转换器添加到transformers.__init__.transformers。

在AST中写代码很难,正因为如此,我们有snippets(https://github.com/nvbn/py-backwards/blob/master/py_backwards/utils/snippet.py#L102):

6ee8642c17234747bfcb83c927794e3e.png

而且你能够使用以下代码很容易地得到snippet的内容:

a104ba27d3704e24a2770a5933ecb07c.png

也请看看tree utils(https://github.com/nvbn/py-backwards/blob/master/py_backwards/utils/tree.py),它包含非常有用的函数,如find,get_parent等等。

MIT授权

英文原文:https://github.com/nvbn/py-backwards

译者:Xiaogang

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值