2to3 未将 .sort() 解析为 sorted()

问题描述

我正在尝试在 Win10 上使用 2to3 将库从 Py 2.7.x 转换为 Py 3.7.x。以下参考来自here

我已经看到要转换 Python 的某些部分,您需要显式添加 Fixers,具体来说:

成语

这个可选的固定器执行几个转换,使 Python 代码更地道。像 type(x) 这样的类型比较是 SomeClass 和 type(x) == SomeClass 被转换为 isinstance(x,SomeClass)。 while 1 变为 while True。此修复程序还尝试利用 sorted() 在适当的地方。比如这个块

L = list(some_iterable) L.sort() 改为

L = 排序(some_iterable)

所以我将它添加到我的命令行中:

2to3 --output-dir=C:\my\py3\module -f all -f buffer -f idioms -f set_literal -f ws_comma -W -n C:\my\py2\module

2to3 将在 C:\my\py3\module 文件夹中生成正确的文件,但 list.sort() 尚未解析为 sorted(list)

在这里遗漏了什么?

解决方法

looks like修复程序实际上只适用于

x = list(z)
x.sort()

模式,没有什么更好的。毕竟2to3不做类型分析。

,

尝试在凌晨 3 点从 github 转换 lib 的产品。真正的问题是 Py2 和 Py3 之间字典 .keys() 的返回值之间的变化。

来自 lib 的片段我正在运行 2to3:

keys = timeSamples.keys()
keys.sort()

我改为:

keys = sorted(timeSamples.keys())

如果我真的阅读了错误消息,就会看到试图在 dict_keys 类型上调用 .sort() 而不是 Py3 中的列表。