lib2to3.fixes.fix_dict
básicamente ajustará cualquier llamada a dict.keys()
, .values()
o .items()
en list()
sin importar su contexto.
Sin embargo, por lo que puedo decir, las llamadas son más o menos inútiles cuando el resultado se itera directamente (por ejemplo, for k, v in d.items()
) o se verifica la contención (por ejemplo, if a in d.keys()
), lo que genera muchas diferencias. ruido para revertir.
Sería bueno si python-future tuviera su propio solucionador de iteraciones de dictados evitando esta molestia.
La iteración de vistas al agregar o eliminar entradas en el diccionario puede generar un RuntimeError o fallar al iterar sobre todas las entradas.
Si el interior del bucle for
agrega o elimina entradas, entonces se necesita list()
He escrito mi propio " fix_dict_methods
" que hace esto:
"""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)
"""
Debería ser más seguro para el código PY2 que se está futurizando poco a poco paso a paso.
Tampoco envuelve ninguna de las llamadas simples .keys/values/items()
en list()
, ya que aún no he encontrado muchos lugares en los que necesitemos esa solución, pero podría seguir con esto como un paso separado - Creo que puedo ejecutar el fix_dict
normal si necesito ese cambio.
Avísame si hay interés en esta variante de fix_dict
. También estoy dispuesta a cambiar su nombre. (¿Quizás fix_dict_methods_with_import
?)
Hola @rdrey , estoy interesado en esta variante. Suena como una buena idea ejecutarlo antes del fix_dict
normal, especialmente si el código base siempre llama a la versión iter
cuando solo necesita un iterador.
¿Te importaría compartirlo?
@rkouye aquí tienes: https://gist.github.com/rdrey/a307f46f7708b65421061374a14d60e9
Comentario más útil
Si el interior del bucle
for
agrega o elimina entradas, entonces se necesitalist()