84 votes

Python interdit-il deux identifiants Unicode de même apparence ?

En jouant avec les identifiants Unicode, je suis tombé sur ceci :

>>> , x = 1, 2
>>> , x
(1, 2)
>>> , f = 1, 2
>>> , f
(2, 2)

Qu'est-ce qui se passe ici ? Pourquoi Python remplace-t-il l'objet référencé par mais seulement parfois ? Où ce comportement est-il décrit ?

87voto

Mark Meyer Points 31911

PEP 3131 -- Support des identifiants non-ASCII dit

Tous les identifiants sont convertis en forme normale NFKC lors de l'analyse syntaxique ; la comparaison des identifiants est basée sur NFKC.

Vous pouvez utiliser unicodedata pour tester les conversions :

import unicodedata

unicodedata.normalize('NFKC', '')
# f

ce qui indiquerait que '' est converti en 'f' dans l'analyse syntaxique. Ce qui conduit à l'attendu :

  = "Some String"
print(f)
# "Some String"

31voto

Eric Duminil Points 38857

Voici un petit exemple, juste pour montrer à quel point cette "fonctionnalité" est horrible :

___dy___g = 42
print(T_ee_º_e___)
# => 42

Essayez-le en ligne ! (Mais s'il vous plaît, ne l'utilisez pas)

Et comme mentionné par @MarkMeyer, deux identifiants peuvent être distincts même s'ils se ressemblent ("CYRILLIC CAPITAL LETTER A" et "LATIN CAPITAL LETTER A").

 = 42
print(A)
# => NameError: name 'A' is not defined

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X