将字典理解向下转换为Python 2.6兼容性的生成器表达式

时间:2014-01-21 20:03:46

标签: python dictionary python-2.6

我的Python 2.7代码中填充了字典理解{x(i):y(i) for i in ...}。我可以访问一个只能运行Python 2.6.6的计算集群。字典理解不是代码耗时部分的一部分,所以我不太担心速度。

我正在寻找最简单的方法来使我的代码符合Python 2.6.6和Python 2.7.6,最好是实际使用支持的字典理解。手动将每个表达式更改为dict((x(i),y(i)) for i in ...)不是首选。

1 个答案:

答案 0 :(得分:0)

您始终可以编写将2.7代码转换为2.6代码的源处理器。

或者,只使用别人写的一个。 3to2项目在其修复程序中有一个名为dctsetcomp的项目。*看起来它完全符合您的要求。以下是其输出的示例:

RefactoringTool: Refactored dc.py
--- dc.py   (original)
+++ dc.py   (refactored)
@@ -1 +1 @@
-{x(i):y(i) for i in z}
+dict((x(i), y(i)) for i in z)
RefactoringTool: Files that need to be modified:
RefactoringTool: dc.py

关于如何使用它的文档并不多,但基本上它的工作方式与2to3完全相同,可以很好地记录,如果需要示例,可以在PyPI的数百个项目中使用。

您可以在准备好分发代码之前在代码上手动运行它,或者在setup.py中将其作为预构建步骤运行(无条件地或仅在2.6上运行时)。 setuptools使得2to3步骤添加到构建/安装过程变得微不足道;颠覆那个运行3to2应该很容易,但我还没有尝试过。


如果您想编写自己的修复程序,或者如果您需要调试/改进此修复程序,或者想要查看,请查看3to2或stdlib的2to3的源代码。从头开始编写一个更简单的解析器。


您可以运行修复程序的第三个位置是运行时,带有导入挂钩。请将MacroPy视为导入挂钩的一个很好的示例。

MacroPy也是一个很好的代码,可以在AST而不是原始源上运行。如果你想构建一个分发时修复程序,这可能很方便,因为那时你可以让Python 2.7解析Python 2.7源代码而你不需要这样做。


如果3to2无法解决问题,您可以通过将代码中编写的内容限制为解析器可以处理的内容来做更简单的事情。例如,您可以为自己设置一个规则,即dict理解必须是该行上唯一的dict显示,然后是#dc。然后你只需要搜索以#dc结尾的行,找到大括号,然后解析结果 - 这意味着你只需要解析一小部分常规语言的Python,这意味着你可以用简单的方法完成它。正则表达式。


*为什么设计用于将3.2+代码移植到2.7的工具有一个dict理解修复工具?因为它最初被设计为将3.1+代码移植到2.6,并且作者从未删除过不再需要的修复程序。所以,你很幸运。 :)