lib2to3.fixes.fix_dict
basicamente encerrará qualquer chamada para dict.keys()
, .values()
ou .items()
em list()
independentemente do contexto.
No entanto, pelo que posso dizer, as chamadas são mais ou menos inúteis quando o resultado é diretamente iterado (por exemplo, for k, v in d.items()
) ou verificado quanto à contenção (por exemplo, if a in d.keys()
) levando a muitas diferenças ruído para reverter.
Seria bom se o python-future tivesse seu próprio fixador de iteração de ditado evitando esse aborrecimento.
A iteração de visualizações ao adicionar ou excluir entradas no dicionário pode gerar um RuntimeError ou falhar ao iterar em todas as entradas.
Se o interior do loop for
está adicionando ou excluindo entradas, então o list()
é necessário
Eu escrevi meu próprio " fix_dict_methods
" que faz isto:
"""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)
"""
Deve ser mais seguro para o código PY2 que está lentamente sendo futurizado, passo a passo.
Ele não quebra qualquer um dos simples .keys/values/items()
chamadas em list()
qualquer um, desde que eu não tenho encontrado muitos pontos que precisamos que fix ainda, mas eu poderia seguir com isso como uma etapa separada - Acho que posso executar o fix_dict
normal se precisar dessa mudança.
Informe se houver interesse nesta variante de fix_dict
. Também estou disposto a mudar seu nome. (Talvez fix_dict_methods_with_import
?)
Olá @rdrey , estou interessado nesta variante. Parece uma boa ideia executá-lo antes do fix_dict
normal, especialmente se a base de código sempre chama a versão iter
quando só precisa do iterador.
Você se importa em compartilhar?
@rkouye aqui está: https://gist.github.com/rdrey/a307f46f7708b65421061374a14d60e9
Comentários muito úteis
Se o interior do loop
for
está adicionando ou excluindo entradas, então olist()
é necessário