[python] 파이썬은 비슷하게 보이는 두 개의 유니 코드 식별자를 금지합니까?

나는 유니 코드 식별자를 가지고 놀았고 이것을 우연히 발견했습니다.

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

여기서 무슨 일이 일어나고 있습니까? 파이썬이에서 참조하는 객체를 대체하는 이유는 무엇 ?입니까? 그 행동은 어디에 설명되어 있습니까?



답변

PEP 3131-비 ASCII 식별자 지원 말한다

모든 식별자는 구문 분석 중에 일반 형식 NFKC로 변환됩니다. 식별자 비교는 NFKC를 기반으로합니다.

unicodedata변환을 테스트하는 데 사용할 수 있습니다 .

import unicodedata

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

이는 파싱에서 '?'변환 됨을 나타냅니다 'f'. 예상되는 결과 :

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


답변

다음은이 “기능”이 얼마나 끔찍한 지 보여주는 간단한 예입니다.

??ᵢ?_f????ᵣₑ_?ₕ????_dₑ?ᵢ?i??ℓy_??_?_?ᵘg = 42
print(T?ℹ?_?e???ᵣe_ₛ?º???_?e?ᵢ?ⁱtᵉ??_?ℯ_?_???)
# => 42

온라인으로 시도하십시오! (하지만 사용하지 마세요)

@MarkMeyer에서 언급했듯이 두 식별자는 똑같아 보이지만 구별 될 수 있습니다 ( “CYRILLIC CAPITAL LETTER A”및 “LATIN CAPITAL LETTER A”).

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


답변