lib2to3.fixes.fix_dict
encapsulera essentiellement tout appel à dict.keys()
, .values()
ou .items()
dans list()
quel que soit son contexte.
Cependant, pour autant que je sache, les appels sont plus ou moins inutiles lorsque le résultat est soit directement itéré (par exemple for k, v in d.items()
) soit vérifié pour le confinement (par exemple if a in d.keys()
) conduisant à beaucoup de diff- bruit pour revenir.
Ce serait bien si python-future avait son propre fixateur d'itérations dict évitant ce désagrément.
L'itération des vues lors de l'ajout ou de la suppression d'entrées dans le dictionnaire peut générer une RuntimeError ou échouer à itérer sur toutes les entrées.
Si l'intérieur de la boucle for
ajoute ou supprime des entrées, alors le list()
est nécessaire
J'ai écrit mon propre " fix_dict_methods
" qui fait ceci :
"""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)
"""
Cela devrait être plus sûr pour le code PY2 qui est progressivement futurisé étape par étape.
Il n'enveloppe aucun des appels simples de .keys/values/items()
dans list()
non plus, car je n'ai pas encore trouvé beaucoup d'endroits où nous avons besoin de ce correctif, mais je pourrais le suivre dans une étape distincte - Je pense que je peux exécuter le fix_dict
normal si j'ai besoin de ce changement.
Faites-moi savoir s'il y a un intérêt pour cette variante de fix_dict
. Je suis également partant pour changer son nom. (Peut-être fix_dict_methods_with_import
?)
Salut @rdrey , je suis intéressé par cette variante. Cela semble être une bonne idée de l'exécuter avant le fix_dict
normal, surtout si la base de code appelle toujours la version iter
lorsqu'elle n'a besoin que d'un itérateur.
Cela vous dérange-t-il de le partager?
@rkouye et voilà : https://gist.github.com/rdrey/a307f46f7708b65421061374a14d60e9
Commentaire le plus utile
Si l'intérieur de la boucle
for
ajoute ou supprime des entrées, alors lelist()
est nécessaire