lib2to3.fixes.fix_dict
将基本换到任何呼叫dict.keys()
, .values()
或.items()
在list()
不管其上下文。
但是,据我所知,当结果直接迭代(例如for k, v in d.items()
)或检查包含情况(例如if a in d.keys()
)导致很多差异时,调用或多或少毫无意义-噪音恢复。
如果 python-future 有自己的 dict-iteration fixer 避免这种烦恼,那就太好了。
在字典中添加或删除条目时迭代视图可能会引发 RuntimeError 或无法迭代所有条目。
如果for
循环内部正在添加或删除条目,则需要list()
我写了自己的“ fix_dict_methods
”来做到这一点:
"""Fixer for some dict methods.
Imports these compatibility methods from `future.utils`.
d.iterkeys() -> iterkeys(d)
d.iteritems() -> iteritems(d)
d.itervalues() -> itervalues(d)
d.viewkeys() -> viewkeys(d)
d.viewitems() -> viewitems(d)
d.viewvalues() -> viewvalues(d)
"""
对于逐步逐步实现未来化的 PY2 代码来说,它应该更安全。
它也没有将任何简单的.keys/values/items()
调用包装在list()
中,因为我还没有找到很多需要修复的地方,但我可能会在一个单独的步骤中跟进它- 如果我需要更改,我想我可以运行正常的fix_dict
。
如果有人对fix_dict
这个变体感兴趣,请告诉我。 我也准备改名。 (也许fix_dict_methods_with_import
?)
嗨@rdrey ,我对这个变体感兴趣。 在正常fix_dict
之前运行它听起来是个好主意,特别是如果代码库总是在只需要迭代器时调用iter
版本。
你介意分享吗?
@rkouye给你: https : //gist.github.com/rdrey/a307f46f7708b65421061374a14d60e9
最有用的评论
如果
for
循环内部正在添加或删除条目,则需要list()