Python到python的编译器允许你在老版本中使用Python 3.6的一些功能

2021-11-06

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的代码,如下:

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

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

用法

安装:

编译代码:

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

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

用tox运行测试:

开发

设置:

运行测试:

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

来写代码转换器

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

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

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

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

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

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

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

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



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


相关文章

详解Python 3.6.x程序打包并发布至pypi的完整过程

2021-11-06
python setup.py sdist和python setup.py bdist_wheel,创建相应的文件,如图:第四步,登录pypi.python.org网站,注册账号并登录,然...

使用Python 3.5/3.6监听本机任意窗口中的按键操作

2021-11-06
python setup.py build_ext --swig=..\swigwin-3.0.12\swig.exe,可以根据实际情况修改swig.exe的路径,另外本机最好已安装VC2008第五...

边看边用!这本 Python 3.6 的书火爆了 IT 圈!

2021-11-06
而且注意这本书是基于Python3.6来的.4.技术方向多这本书涵盖了网络编程、数据分析、网络爬虫等大量企业实用的知识,内容涵盖了...

如何在 Linux 中安装最新的 Python 3.6 版本

2021-11-06
Python 3.6在我写这篇文章的时候(2017 年三月中旬),在 CentOS 和 Debian 8 中可用的最新 Python 版本分别是 Python 3.4 和 ...

Python 3.6 Highlights

2021-11-06
//docs.python.org/3.9/whatsnew/3.6.html#whatsnew36-pep525之前yield和await没法在同一个函数里用,现在可以了,所以可以做成异...

《统计学习方法》的Python 3.6复现,已开源!

2021-11-06
Python 3.6,已经全部测试通过.项目地址:https://github.com/fengdu78/lihang-code文末附电子书及代码下载方式《统计学习方法》,...

使用异步Python 3.6和Redis编写快速应用程序

2021-11-06
英文原文:https://eng.paxos.com/write-fast-apps-using-async-python-3.6-and-redis 译者:guoziqing

Python3.6入门与进阶实战等多套视频教程

2021-11-06
以下是一些视频教程的链接与关键词,关注以下公众号二维码,回复关键词就可领取Python进阶与实战视频教程链接: https://pan....

资源 | 《统计学习方法》的Python 3.6复现,实测可用

2021-11-06
Python数据科学【读者福利】 ↓↓↓【知识星球】:Python数据科学学习社区【限时下载】:500g学习资源免费领取往期精彩推荐 ↓↓↓【1】...

刷爆抖音,4万好评!这本 Python 3.6 的书又断货了...

2021-11-06
而且注意这本书是基于Python3.6来的.4.技术方向多这本书涵盖了网络编程、数据分析、网络爬虫等大量企业实用的知识,内容涵盖了...

随机推荐