Estaba jugando con identificadores Unicode y me encontré con esto:
>>> 𝑓, x = 1, 2
>>> 𝑓, x
(1, 2)
>>> 𝑓, f = 1, 2
>>> 𝑓, f
(2, 2)
¿Que está pasando aqui? ¿Por qué Python reemplaza el objeto al que se hace referencia 𝑓
, pero solo a veces? ¿Dónde se describe ese comportamiento?
𝑓=1
f=2
print(𝑓)
a, a = 1, 2; a, a
. Esto no tiene nada que ver conf
o𝑓
.𝑓 = 3; f
bastaría.Respuestas:
PEP 3131 - Admite identificadores no ASCII dice
Puede utilizar
unicodedata
para probar las conversiones:import unicodedata unicodedata.normalize('NFKC', '𝑓') # f
lo que indicaría que
'𝑓'
se convierte'f'
en al analizar. Conduciendo a lo esperado:𝑓 = "Some String" print(f) # "Some String"
fuente
π
como un identificador de Python que sea distinto dep
muy bien. Si lo entiendo correctamente, el plegado NFK * se trata de caracteres que la gente de Unicode pensó que deberían haber sido el mismo carácter para empezar, pero no se pueden fusionar debido a la compatibilidad con versiones anteriores con algunas codificaciones heredadas.Aquí hay un pequeño ejemplo, solo para mostrar lo horrible que es esta "función":
𝕋𝐡ᵢ𝔰_f𝔢𝘢𝚝𝓊ᵣₑ_𝕤ₕ𝔬𝔲𝖑𝔡_dₑ𝕗ᵢ𝘯i𝘵𝚎ℓy_𝒷𝘦_𝐚_𝚋ᵘg = 42 print(T𝗵ℹ𝚜_𝒇e𝖆𝚝𝙪ᵣe_ₛ𝔥º𝓾𝗹𝙙_𝚍e𝒇ᵢ𝒏ⁱtᵉ𝕝𝘆_𝖻ℯ_𝔞_𝖇𝖚𝓰) # => 42
¡Pruébelo en línea! (Pero por favor no lo uses)
Y como lo menciona @MarkMeyer, dos identificadores pueden ser distintos aunque tengan el mismo aspecto ("LETRA A MAYÚSCULA CIRÍLICA" y "LETRA A CAPITAL LATINA")
А = 42 print(A) # => NameError: name 'A' is not defined
fuente
А = 42; print(A)
-> "NameError: el nombre 'A' no está definido"