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()