Para cada contêiner python C, a expectativa é que
for item in C:
assert item in C
vai passar muito bem - você não acha surpreendente se um sentido da in
(a cláusula loop) tivesse um significado completamente diferente do outro (a verificação de presença)? Eu com certeza faria! Naturalmente, funciona dessa maneira para listas, conjuntos, tuplas, ...
Portanto, quando C
é um dicionário, in
para gerar tuplas de chave / valor em um for
loop, então, pelo princípio de menor espanto, in
também seria necessário usar uma tupla como seu operando esquerdo na verificação de contenção.
Quão útil isso seria? Bastante inútil, na verdade, basicamente, tornando if (key, value) in C
um sinônimo para if C.get(key) == value
- que é um cheque que eu acredito que pode ter realizado, ou queria fazer, 100 vezes mais raramente do que o que if k in C
realmente significa , verificando a presença da chave única e ignorando completamente o valor.
Por outro lado, querer fazer um loop apenas nas teclas é bastante comum, por exemplo:
for k in thedict:
thedict[k] += 1
ter o valor também não ajudaria particularmente:
for k, v in thedict.items():
thedict[k] = v + 1
na verdade, um pouco menos claro e menos conciso. (Observe que items
era a ortografia original dos métodos "adequados" a serem usados para obter pares de chave / valor: infelizmente, isso foi nos dias em que esses acessadores retornavam listas inteiras, de modo a apoiar a "iteração" uma ortografia alternativa teve que ser introduzida e iteritems
foi - no Python 3, onde as restrições de compatibilidade com versões anteriores das versões anteriores do Python foram muito enfraquecidas, tornou-se items
novamente).
x in foo
somente sei
infor i in foo
assume o valor dex
em algum momento, eu diria que seria uma enorme inconsistência.