lib2to3.fixes.fix_dict
umschließt grundsätzlich jeden Anruf an dict.keys()
, .values()
oder .items()
in list()
unabhängig vom Kontext.
Soweit ich das beurteilen kann, sind die Aufrufe jedoch mehr oder weniger sinnlos, wenn das Ergebnis entweder direkt iteriert (zB for k, v in d.items()
) oder auf Eindämmung überprüft wird (zB if a in d.keys()
), was zu vielen Unterschieden führt. Rauschen umzukehren.
Wäre schön, wenn Python-Future einen eigenen Diktat-Iterations-Fixer hätte, der diesen Ärger vermeidet.
Das Iterieren von Ansichten beim Hinzufügen oder Löschen von Einträgen im Wörterbuch kann einen RuntimeError auslösen oder die Iteration über alle Einträge fehlschlagen.
Wenn das Innere der for
Schleife Einträge hinzufügt oder löscht, dann wird list()
benötigt
Ich habe mein eigenes " fix_dict_methods
" geschrieben, das dies tut:
"""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)
"""
Es sollte sicherer für PY2-Code sein, der langsam Schritt für Schritt futurisiert wird.
Es schließt auch keinen der einfachen .keys/values/items()
Aufrufe in list()
, da ich noch nicht viele Stellen gefunden habe, an denen wir diese Korrektur benötigen, aber ich könnte es als separaten Schritt weiterverfolgen - Ich denke, ich kann die normalen fix_dict
ausführen, wenn ich diese Änderung brauche.
Lassen Sie es mich wissen, wenn Interesse an dieser Variante von fix_dict
. Ich bin auch bereit, seinen Namen zu ändern. (Vielleicht fix_dict_methods_with_import
?)
Hallo @rdrey , ich interessiere mich für diese Variante. Klingt nach einer guten Idee, es vor dem normalen fix_dict
auszuführen, insbesondere wenn die Codebasis immer die Version iter
aufruft, wenn sie nur einen Iterator benötigt.
Macht es Ihnen etwas aus, es zu teilen?
@rkouye hier gehts: https://gist.github.com/rdrey/a307f46f7708b65421061374a14d60e9
Hilfreichster Kommentar
Wenn das Innere der
for
Schleife Einträge hinzufügt oder löscht, dann wirdlist()
benötigt