É legítimo usar em items()
vez de iteritems()
em todos os lugares? Por que foi iteritems()
removido do Python 3? Parece um método fantástico e útil. Qual é o raciocínio por trás disso?
Editar: para esclarecer, quero saber qual é o idioma correto para iterar sobre um dicionário de maneira semelhante a um gerador (um item de cada vez, não todos na memória) de uma forma compatível com o Python 2 e o Python 3 ?
fonte
iteritems
é um iterador, e é por isso que é tão útil. Eu quase nunca quero repetir um dicionário como uma lista. Então, qual é a maneira correta de iterar no dicionário com algo como um gerador compatível com o Python 2 e 3?for key in some_dict
funciona em ambos - e a2to3
ferramenta será traduzidaiteritems()
paraitems()
qualquer forma ...for k in d: d[k]
é desnecessariamente verbose / unpythonicAssim como @Wessie observou,
dict.iteritems
,dict.iterkeys
edict.itervalues
(que retornar um iterador em python2.x), bem comodict.viewitems
,dict.viewkeys
edict.viewvalues
(que retornam ver objetos em python2.x) foram todas removidas em Python3.xE
dict.items
,dict.keys
edict.values
usado para retornar uma cópia da lista do dicionário em python2.x agora retornar ver objetos em Python3.x, mas eles ainda não são o mesmo que iterator .Se você deseja retornar um iterador no Python3.x, use
iter(dictview)
:fonte
Você não pode usar
items
em veziteritems
de todos os lugares em Python. Por exemplo, o seguinte código:irá quebrar se você usar
items
:O mesmo vale para os itens de exibição , disponíveis no Python 3.
Além disso, como os itens retornam uma cópia da lista de
(key, value)
pares do dicionário , é menos eficiente, a menos que você deseje criar uma cópia de qualquer maneira.No Python 2, é melhor usar
iteritems
para iteração. A2to3
ferramenta pode substituí-loitems
se você decidir atualizar para o Python 3.fonte
future.utils permite compatibilidade com python 2 e 3
https://python-future.org/compatible_idioms.html
fonte