Pour chaque conteneur Python C, l'attente est que
for item in C:
assert item in C
passera très bien - ne trouveriez- vous pas étonnant qu'un sens de in
(la clause de boucle) ait une signification complètement différente de l'autre (le contrôle de présence)? Je le ferais sûrement! Cela fonctionne naturellement de cette façon pour les listes, les ensembles, les tuples, ...
Donc, quand C
est un dictionnaire, s'il in
devait produire des tuples clé / valeur dans une for
boucle, alors, par le principe du moindre étonnement, in
devrait également prendre un tel tuple comme son opérande de gauche dans le contrôle de confinement.
Dans quelle mesure cela serait-il utile? Assez inutile en effet, en fait if (key, value) in C
un synonyme de if C.get(key) == value
- ce qui est un contrôle que je pense avoir effectué, ou voulu effectuer, 100 fois plus rarement que ce que signifieif k in C
réellement , vérifier la présence de la clé uniquement et en ignorant complètement la valeur.
D'un autre côté, vouloir boucler uniquement sur des touches est assez courant, par exemple:
for k in thedict:
thedict[k] += 1
avoir la valeur aussi n'aiderait pas particulièrement:
for k, v in thedict.items():
thedict[k] = v + 1
en fait un peu moins clair et moins concis. (Notez que items
c'était l'orthographe originale des méthodes "appropriées" à utiliser pour obtenir des paires clé / valeur: malheureusement, c'était à l'époque où ces accesseurs renvoyaient des listes entières, donc pour prendre en charge "juste l'itération", une orthographe alternative a dû être introduite , et iteritems
c'était - dans Python 3, où les contraintes de compatibilité ascendante avec les versions précédentes de Python étaient beaucoup affaiblies, il le redevint items
).
x in foo
seulement sii
infor i in foo
prend la valeur dex
à un moment donné, je dirais que ce serait une très grande incohérence.