我正在查看2to3的输出,其中包括以下更改:
- for file_prefix in output.keys():
+ for file_prefix in list(output.keys()):
输出(output
)是一个字典。
这个改变有什么重要性?为什么2to3会这样做?
这个改变如何使代码兼容Python 3?
我正在查看2to3的输出,其中包括以下更改:
- for file_prefix in output.keys():
+ for file_prefix in list(output.keys()):
输出(output
)是一个字典。
这个改变有什么重要性?为什么2to3会这样做?
这个改变如何使代码兼容Python 3?
.keys()
方法返回一个视图对象而不是列表,这样更加高效。在迭代的情况下,这并不重要,但是如果您像这样做 foo.keys()[0]
就会有问题,因为您无法对视图进行索引。因此,2to3
总是添加一个明确的列表转换,以确保任何潜在的索引不会破坏代码。您可以在任何视图能够很好地工作的地方手动删除 list()
调用;2to3
只是无法判断哪种情况属于哪种情况。(请注意,2.x 版本可以调用 iterkeys()
,因为它没有索引。)dict.keys()
返回一个list
。dict.keys()
返回一个视图并且必须传递给list()
才能将其转换为list
。list
,所以应该调用dict.iterkeys()
代替。.keys()
返回一个键的列表,但在Python 3中它返回一个非列表迭代器。由于2to3无法知道您是否真正需要将键作为列表,因此它必须谨慎处理并将调用包装在list
中,以便您确实获得一个列表。keys
返回一个列表,而在Python3中,keys
的返回值是一个dict_keys
对象。因此,如果你依赖于列表结果的行为,那么需要进行显式转换。
d.keys()[0]
。 - Padraic Cunninghamfor file_prefix in output:
时,但 py2to3 无法猜测。 - Jean-François Fabre