2010-08-13 38 views
7

Me he dado cuenta de que no puedo usar todos los caracteres Unicode en mi código fuente python.Algunos caracteres utf8 permitidos en la fuente python, algunos no

Mientras

def 价(何): 

está perfectamente ALLRIGHT (aunque sin sentido [probablemente?]),

def N(N₀, t, λ) -> 'N(t)': 

esto no está permitido (el subíndice cero que es).

Tampoco puedo usar algunos otros caracteres, la mayoría de los cuales reconozco como algo más que letras (operadores matemáticos, por ejemplo). Siempre pensé que si me apegaba a las reglas que conozco, es decir, componer nombres de letras y números, con una letra como primer personaje, todo estará bien. Ahora, el subíndice cero es claramente un 'número'. entonces mi impresión fue incorrecta

Sé que debo evitar el uso de caracteres especiales. Sin embargo, la definición de la función anterior (el decaimiento exponencial que es) me parece perfectamente razonable, porque nunca cambiará y transmite con elegancia toda la información necesaria para que otro programador la use.

Mi pregunta, por lo tanto, ¿qué caracteres están permitidos exactamente y cuáles no? ¿Y donde?

Editar
bien no parecen haber sido lo suficientemente clara. Estoy usando python3, por lo que no es necesario declarar la codificación del archivo fuente. Aparentemente, a partir de ese momento, pensé que mi definición de función china funciona.

Mi pregunta se refiere a por qué algunos caracteres están permitidos allí, mientras que otros no. El cero del subíndice genera un error, carácter no válido en el identificador, pero el cero negrita de la pizarra funciona. Ambos igualmente especial Yo diría.

Me gustaría saber si hay reglas generales que se apliquen no solo a mi situación, debe haber. Parece que mi error no es un accidente.

Edición 2:

La cortesía respuesta de Beau Martínez, me apunta a la referencia del lenguaje, donde debería haber mirado en el primer lugar:

http://www.dcl.hpi.uni-potsdam.de/home/loewis/table-3131.html Parece que los caracteres que se permiten son todos elegidos

+0

FWIW, También me parece extraño que un lenguaje con una fortaleza en la competencia científica permita en los identificadores "CINCO NUMÉRICOS ROMANOS", "CINCO INDÍGENAS ÁRABE-INDÍGENAS", "CINCO ÁRABE INDÍGENAS EXTENDIDOS CINCO", "CINCO DIVISOS DEVANAGARÍ" , "BENGALI DIGIT CINCO", "GURMUKHI DIGIT CINCO", <20 otros 5), "FULLWIDTH DIGIT CINCO" - pero no un subíndice "5". Especialmente "fullwidth" no es un lenguaje en sí mismo sino una variante de letra, como lo es un subíndice. Además, "ℌ" o "ℂ" también son meras variantes, pero están permitidas. –

Respuesta

4

Según el language reference, Python 3 permite una gran variedad de caracteres como identificadores.

Ese carácter de subíndice cero parece un número, pero no es para Python; Python solo trata 0, 1, 2, 3, 4, 5, 6, 7, 8 y 9 como números. De hecho, es un personaje, por lo que puede usarlo como identificador (es como si fuera, por ejemplo, un personaje griego como Phi).

Lo que es más importante, ¿con qué facilidad puede escribir esos caracteres con el teclado? No quiero levantar el mapa de caracteres cada vez que tengo que llamar a sus funciones, por ejemplo. Llamarlo "maximum_decay_rate" o algo mucho más intuitivo para cualquier usuario, no solo un especial de Física, hace que tu código sea más legible.

Si dice que no está permitido, es probable que sea porque no ha especificado el character encoding para su archivo de origen. Se puede especificar teniendo # -*- coding: utf-8 -*- (o cualquiera que sea la codificación) al principio de su archivo fuente.

+0

Como puede ver, solo estaba usando caracteres 'especiales' donde nunca tendrían que ser tipeados por nadie, a menos que el universo cambie su mente acerca del decaimiento exponencial. :-) Pero sí, probablemente debería llamarse decaimiento(). He actualizado la pregunta ahora. –

3

Dile Python cuál es la codificación correcta es:

https://www.python.org/dev/peps/pep-0263/

O ...

# -*- coding: utf-8 -*- 

o

# coding=utf-8 

En cuanto a lo que son en realidad caracteres permitidos en los nombres de variables, por lo general la restricción es alfabéticos caracteres, dígitos y guiones bajos.

El "cero del subíndice" no es en realidad un dígito, es un subíndice.

+0

lo siento, debería haber mencionado que estoy usando Python 3. –

0

Cada carácter Unicode tiene 'propiedades' específicas, que se encuentran en la Base de datos de caracteres Unicode, y para nuestro propósito las propiedades de la llamada Categoría general son las más importantes. Permiten a particionar todos los personajes en grupos grandes:

  • letras (L)
  • números (N)
  • marcas (M)
  • signos de puntuación (P)
  • símbolos (S)
  • separadores (Z)
  • otros (C)

Los grupos tienen subgrupos, por ejemplo Lu es Uppercase_Letter. De acuerdo con Python Language Reference (3.4.1), primero se debe normalizar la secuencia de caracteres en formato NFKC (lo que en la práctica significa descomponer caracteres con signos diacríticos y 'simplificarlos', por ejemplo, cambiar el subíndice 0 en 0 normal). Luego, el inicio del identificador debe ser un guión bajo o una letra (todo el grupo de letras más Nl - números en forma de letras), más algunos otros símbolos tipo carta. Se vuelve mucho más interesante cuando miramos los personajes que están permitidos como continuación del identificador.Además, podemos usar: Decimal_Numbers (Nd), que son de hecho dígitos del 0 al 9, pero en muchas formas, por ejemplo MATHEMATICAL MONOSPACE DIGIT NINE, que es el carácter \U0001D7FF (todos juntos 70 caracteres); la mayoría de las marcas (M), con la excepción de las marcas adjuntas (Me) - aquí tenemos todos los signos diacríticos (acentos); todos los caracteres del subgrupo Pc - conectores de puntuación, por lo tanto no solo subrayado, sino también varios vínculos (10 caracteres); algunos caracteres adicionales tipo dígito (por ejemplo, dígitos etíopes del 0 al 9); puntos medios (2 caracteres).

Como se ve de lo anterior, N con un subíndice 0 debe aceptarse como un identificador. Cuando traté de pegarlo desde Word, tanto IDLE como Wing 101 insertaron los formularios normalizados en el editor (es decir, N0). Sospecho que el autor de la pregunta intentó usar un carácter secundario que no pudo ser normalizado correctamente.

+0

No entiendo esta respuesta. Hay exactamente un subíndice cero en Unicode, y no está permitido en un identificador de Python. –

Cuestiones relacionadas