¿Es malo usar caracteres Unicode en nombres de variables? [cerrado]

82

Recientemente intenté implementar un algoritmo de clasificación, AllegSkill, en Python 3.

Así es como se ven las matemáticas:

texto alternativo

No realmente.

Esto es lo que escribí:

t = (µw-µl)/c  # those are used in
e = ε/c        # multiple places.
σw_new = (σw**2 * (1 - (σw**2)/(c**2)*Wwin(t, e)) + γ**2)**.5

De hecho, pensé que es desafortunado de Python 3 no aceptar o ²como nombres de variables.

>>> √ = lambda x: x**.5
  File "<stdin>", line 1
    √ = lambda x: x**.5
      ^
SyntaxError: invalid character in identifier

¿Estoy fuera de mi mente? ¿Debería haber recurrido a una versión solo ASCII? ¿Por qué? ¿No sería más difícil validar una única versión ASCII de lo anterior para determinar la equivalencia con las fórmulas?

Eso sí, entiendo que algunos glifos Unicode se parecen mucho entre sí y algunos como (o es eso ▗▖) o ╦ simplemente no tienen sentido en el código escrito. Sin embargo, este no es el caso para las matemáticas o los glifos de flecha.


Por solicitud, la única versión ASCII sería algo similar a:

winner_sigma_new = ( winner_sigma ** 2 *
                    ( 1 -
                     ( winner_sigma ** 2 -
                       general_uncertainty ** 2
                     ) * Wwin(t,e)
                    ) + dynamics ** 2
                   )**.5

... por cada paso del algoritmo.

badp
fuente
58
Eso es una locura, completamente ilegible e indescriptiblemente genial.
Dominique McDonnell el
2
Hablando de Unicode ... codinghorror.com/blog/2008/03/i-entity-unicode.html
CoderHawk
3
Me parece muy bueno que Python no acepte operaciones aritméticas como variables. Un signo de raíz cuadrada debe denotar la operación de sacar una raíz cuadrada, y no debe ser una variable.
David Thornley el
44
@David, no hay tal distinción en Python. De hecho, sqrt = lambda x: x**.5me hace una función (más precisamente, una opción de rescate): sqrt(2) => 1.41421356237.
badp
44
OutputStream.🚽;

Respuestas:

54

Siento firmemente que solo reemplazar σcon so sigmasería estúpido, bordeando la muerte cerebral.

¿Cuál es la ganancia potencial? Bien, veamos …

  • ¿Mejora la legibilidad? No, no en lo más mínimo. Si así fuera, la fórmula original sin duda también habría utilizado letras latinas.

  • ¿Mejora la capacidad de escritura? A primera vista, sí. Pero en el segundo, no. Porque esta fórmula nunca va a cambiar (bueno, "nunca"). Normalmente no habrá necesidad de cambiar el código, ni de extenderlo usando estas variables. Entonces, la capacidad de escritura no es un problema, solo por esta vez.

Personalmente, creo que los lenguajes de programación tienen una ventaja sobre las fórmulas matemáticas: puede usar identificadores significativos y expresivos. En matemáticas, este no suele ser el caso, por lo que recurrimos a variables de una letra, ocasionalmente haciéndolas griegas.

Pero el griego no es el problema. Los identificadores no descriptivos de una letra son.

Así que, o mantener la notación original, ... después de todo, si el lenguaje de programación lo hace compatible con Unicode en los identificadores, así que no hay obstáculo técnico. O use identificadores significativos. No solo reemplace los glifos griegos con glifos latinos. O árabes, o hindúes.

Konrad Rudolph
fuente
3
Algunas herramientas no pueden leer caracteres unicode, a pesar de que el lenguaje de programación admite su uso. No lo llamaría una decisión cerebral para usar nombres de variables no Unicode, y esto sigue siendo cierto 2.5 años después de su publicación.
Gary S. Weaver
44
@Gary “Algunas herramientas no pueden leer Unicode”, así que cambie las herramientas, son basura. Lo siento, es 2013 y tengo cero simpatía e incluso menos paciencia para tales herramientas. El abastecimiento incesante de herramientas defectuosas impide el progreso.
Konrad Rudolph
3
@KonradRudolph Mi punto es que algunas herramientas no admiten ni pueden admitir Unicode por el motivo que sea, por lo que "cambiar las herramientas" no siempre es la respuesta correcta. Estoy de acuerdo en que Unicode es bueno y que las herramientas deberían entenderlo, pero eso no siempre es una opción.
3
@John Mantengo que "cambiar las herramientas" es una respuesta apropiada. Su ejemplo en particular ilustra este caso: los .propertiesarchivos Java son triviales para analizar. Si realmente trabajó con una cadena de herramientas que, respaldada por .propertiesarchivos, no era compatible con Unicode, es completamente razonable abandonar dicha cadena de herramientas (y reemplazarla usted mismo, encontrar una alternativa o, en el peor de los casos, comisionar una ) Por supuesto, esto no se aplica a los sistemas heredados. Pero para los sistemas heredados, ninguna de las consideraciones para las mejores prácticas se aplica.
Konrad Rudolph
8
Estos problemas de "intercambio" de los que habla parecen ser principalmente el problema de los desarrolladores de Java y Windows. La mayor parte del mundo Linux se estandarizó en UTF-8 hace más de una década. Definitivamente es un problema de cadena de herramientas. Deja de usar malas herramientas.
rico remer
33

Personalmente, odiaría ver el código donde tengo que mostrar el mapa de caracteres para volver a escribirlo. A pesar de que el Unicode coincide estrechamente con lo que está en el algoritmo, está realmente perjudicando la capacidad de lectura y la capacidad de edición. Es posible que algunos editores ni siquiera tengan una fuente que admita ese carácter.

¿Qué tal una alternativa y simplemente tener arriba //µ = uy escribir todo en ascii?

TheLQ
fuente
14
Por cierto, no asuma que todos los teclados exponen cómodamente las teclas de codificación estándar. Mi diseño de teclado necesita tres teclas para escribir {y }(que falla en ttys por cierto) y carece por completo `y ~... ¿cómo no cualquier script de Bash no requeriría que use un mapa de caracteres, si no estuviera usando un mapa de teclas personalizado? :)
badp
44
Instalé un teclado griego junto a mi nativo, y puedo cambiar entre aquellos con solo presionar una tecla. Esto es útil cuando hablamos de matemáticas en mensajería instantánea / correo electrónico ... y ya pensé en usarlo en scripts de Python.
liori
18
Ugh ¿Solo reemplazando las letras griegas por letras simples? No hay ganancia alguna. Use nombres de variables significativos o quédese con los nombres del documento. No hay razón para ser creativo.
Konrad Rudolph el
12
Simplemente no mezcle µ y μ ...
endolito
44
Los editores razonables tienen métodos de entrada razonables para Unicode que facilitan la edición de código como este. Por ejemplo, Emacs admite (entre otras cosas) la TeXy rfc1345. TeXes justo lo que parece; te permite escribir \sigmapor σy \topara . rfc1345te da algunas combinaciones como &s*for σy &->for . Como regla general, no me preocupa acomodar a los programadores que usan editores menos capaces que Emacs.
Tikhon Jelvis
31

Este argumento asume que no tienes problemas para escribir unicodes ni leer letras griegas

Aquí está el argumento: ¿te gustaría pi o circular_ratio?

En este caso, preferiría pi a circular_ratio porque aprendí sobre pi desde que estaba en la escuela primaria y puedo esperar que la definición de pi esté bien arraigada para cada programador que valga la pena. Por lo tanto, no me importaría escribir π para significar circular_ratio.

Sin embargo, ¿qué pasa con

winner_sigma_new = ( winner_sigma ** 2 *
                    ( 1 -
                     ( winner_sigma ** 2 -
                       general_uncertainty ** 2
                     ) * Wwin(t,e)
                    ) + dynamics ** 2
                   )**.5

o

σw_new = (σw**2 * (1 - (σw**2)/(c**2)*Wwin(t, e)) + γ**2)**.5

Para mí, ambas versiones son igualmente opacas, como pio πes, excepto que no aprendí esta fórmula en la escuela primaria. winner_sigmay Wwinno significa nada para mí, ni para nadie más que lea el código, y usar ninguno σwno lo hace mejor.

Por lo tanto, el uso de nombres descriptivos, por ejemplo total_score, winning_ratioetc. aumentaría la legibilidad mucho mejor que el uso de nombres ascii que simplemente pronuncian letras griegas . El problema no es que no puedo leer letras griegas, pero no puedo asociar los caracteres (griegos o no) con un "significado" de la variable.

Por supuesto que entiende el problema usted mismo cuando usted comentó: You should have seen the paper. It's just eight pages.... El problema es que si basa su denominación variable en un documento, que elige nombres de una letra por concisión en lugar de legibilidad (independientemente de si son griegos), entonces las personas tendrían que leer el documento para poder asociar las letras con un "sentido"; Esto significa que está poniendo una barrera artificial para que las personas puedan entender su código, y eso siempre es algo malo.

Incluso cuando se vive en un mundo sólo ASCII, tanto a * b / 2y alpha * beta / 2es una representación igual de opaca height * base / 2, la fórmula del área del triángulo. La imposibilidad de leer variables de una sola letra aumenta exponencialmente a medida que la fórmula crece en complejidad, y la fórmula AllegSkill ciertamente no es una fórmula trivial.

La variable de letras individuales solo es aceptable como un contador de bucle simple, ya sean griegas de una letra o ascii de una letra, no me importa; ninguna otra variable debe consistir únicamente en una sola letra. No me importa si usa letras griegas para sus nombres, pero cuando las use, asegúrese de que pueda asociar esos nombres con un "significado" sin necesidad de leer un documento arbitrario en otro lugar.

Cuando estoy en la escuela primaria, definitivamente no me importaría ver expresiones matemáticas usando símbolos como: +, -, ×, ÷, para la aritmética básica y √ () sería una función de raíz cuadrada. Después de graduarme de la escuela primaria, no me importaría agregar nuevos símbolos brillantes: ∫ para la integración. Tenga en cuenta la tendencia, estos son todos los operadores. Los operadores se usan mucho más que los nombres de variables, pero se reutilizan con menos frecuencia para un significado completamente diferente (en el caso de que los matemáticos reutilicen operadores, el nuevo significado a menudo todavía tiene algunas propiedades básicas del significado anterior; este no es el caso para al reutilizar nombres de variables).

En conclusión, no, no está mal usar caracteres Unicode para nombres de variables; sin embargo, siempre es malo usar nombres de letras simples para nombres de variables, y tener permiso para usar nombres Unicode no es una licencia para usar nombres de variables de letras únicas.

Lie Ryan
fuente
99
Para ser honesto, las fórmulas aquí no tienen más sentido, incluso si fuera a usar en error_on_measured_skill_with_99th_percent_confidencelugar de sigma.
badp
44
@badp: ¡Nombres largos! = Buenos nombres. Sin embargo, hay ocasiones en las que le es imposible elegir un buen nombre (por ejemplo, cuando solo comprende la fórmula, pero no comprende completamente lo que hace cada parte de la fórmula (lo que requiere un nivel de comprensión completamente diferente)), entonces, en ese caso, la segunda mejor alternativa es cubrirse el culo con algunos comentarios (mejor que enviarlos a un documento externo). Agregue un diccionario de datos que explique a qué se refieren los nombres de las variables, p // σw = skill level measurement error. Ej. , Etc.
Lie Ryan
1
@badp: Para ser honesto, con solo esa información, que sigma se refiere a algún factor de fraude (por así decirlo), me da una mejor comprensión de la fórmula que lo que sigma me llama la atención. Para empezar, cuando la fórmula es difícil de entender, no desea agregar más opacidad encima.
Lie Ryan
2
Si. Esta. Desafortunadamente, lo pasé por alto al escribir mi respuesta.
Konrad Rudolph el
3
Bueno, cualquiera que trabaje en algo relacionado con estadísticas sabe que σ significa "desviación estándar". Es un símbolo estándar muy conocido en ese dominio.
TRiG
14

¿Entiendes el código? ¿Todos los demás que necesitan leerlo? Si es así, no hay problema.

Personalmente, me alegraría ver la parte posterior del código fuente solo ASCII.


fuente
Hecho. (Supongo que la última línea fue que pedías ver la versión del código solo para ASCII) [] (http: // ~)
badp
44
@badp: No, fui yo pidiendo ver la muerte del código solo ASCII.
hasta que se empieza a ver lo que ocurre con los archivos fuente Unicode cuando aterrizan en un sistema Windows 1252 ...
1
@ Thorbjørn: si contienen la lista de materiales, entonces espero que no pase nada.
9

Sí, estás loco. Yo personalmente haría referencia al papel y al número de fórmula en un comentario, y escribiría todo en ASCII directo. Entonces, cualquier persona interesada podría correlacionar el código y la fórmula.

zvrba
fuente
55
Fue difícil para mí asegurarme de que el código y la fórmula coincidieran en primer lugar ...
badp
10
@Paul: afortunadamente, Unicode tiene> 10 años, por lo que esa objeción ha sido resuelta. Y aunque no hay un ganador claro entre los diferentes UTF, eso no es un problema: no se suponía que hubiera uno. Distinguirlos es trivial para el software.
Konrad Rudolph el
1
@Konrad: me refiero a 10 años a partir de ahora . Una buena cantidad de programas aún no son compatibles con Unicode. Además, no estoy de acuerdo con su afirmación: no es trivial escribir una rutina inversa genérica que maneje los 3 utfs. Tiene que haber un claro ganador. No tiene sentido admitir 3 UTF diferentes (no consideremos las otras páginas de códigos aún existentes).
Paul Nathan
3
@Paul: ¿Con qué frecuencia necesita escribir una "rutina inversa genérica"? Los tres UTF tienen diferentes propósitos, y no creo que alguna vez vayas a conseguir tu deseo de consolidación.
Dean Harding
77
@Paul: atornille estos programas. Hay suficientes buenos editores que saben cómo manejar Unicode. Si algún editor aún no se ha subido al tren, deje que la selección económica se encargue de ello. Y como dijo Dean, los UTF tienen diferentes propósitos. Es bueno que existan. Y no veo el punto en sus múltiples rutinas inversas. Solo necesita escribirlo una vez (ignorando los formularios de normalización por ahora): para puntos de código, no para UTF individuales.
Konrad Rudolph el
5

Diría que usar nombres de variables Unicode es una mala idea por dos razones:

  1. Son una PITA para escribir.

  2. A menudo se ven casi iguales a las letras en inglés. Esta es la misma razón por la que odio ver letras griegas en notación matemática. Intenta distinguir rho aparte de p. No es fácil.

dsimcha
fuente
66
Depende de lo que estés usando para escribirlos.
endolito
4

En este caso, una fórmula matemática compleja, diría que anímate.

Puedo decir que en 20 años nunca he tenido que codificar algo tan complejo y las letras griegas lo mantienen cerca de las matemáticas originales. Si no puede entenderlo, no debería mantenerlo.

Diciendo que, si alguna vez tengo que mantener μ y σ en el pantano de código estándar que me legó, yo voy a averiguar dónde vivo ...

gbn
fuente
3
  • Pro: se ve bien
  • Con: los caracteres unicode y, por lo tanto, todo el significado podría perderse en la cadena de herramientas (editor, formateador de código, control de versiones, compilador anterior)

¿Qué tan grande es el riesgo para ti? ¿La ganancia supera el riesgo?

LennyProgrammers
fuente
2
Cadena de herramientas? ¿Qué cadena de herramientas?
badp
2
Editor, formateador de código, control de versiones, compilador anterior. Cada herramienta y persona tocando su archivo. He tenido una mala experiencia con herramientas que alteran los archivos Unicode, YMMV.
LennyProgrammers
2

En algún momento en un futuro no muy lejano, todos utilizaremos editores de texto / IDEs / navegadores web que facilitan la escritura de texto de edición, incluidos los caracteres griegos clásicos, etc. (O tal vez todos hemos aprendido a usar este "oculto" "funcionalidad en las herramientas que usamos actualmente ...)

Pero hasta que eso suceda, los caracteres no ASCII en el código fuente del programa serían difíciles de manejar para muchos programadores y, por lo tanto, es una mala idea si está escribiendo aplicaciones que podrían necesitar ser mantenidas por otra persona.

(Por cierto, la razón por la que puede tener caracteres griegos pero no signos de raíz cuadrada en los identificadores de Python es simple. Los caracteres griegos se clasifican como letras Unicode, pero el signo de raíz cuadrada no es una letra; consulte http://www.python.org / dev / peps / pep-3131 / )

Stephen C
fuente
Creo que sería una gran idea hacer un IME que pudiera traducir caracteres para usuarios que no pueden ingresarlos directamente.
AndrejaKo
Sí, más o menos cuando habremos cambiado a DVORAK. :(
badp
1
@AndrejaKo Linux tiene un IME que acepta comandos de estilo LaTeX, es decir, escribe \mue inserta µ.
badp 01 de
@badp Muchas gracias! ¡Lo intentaré la próxima vez que arranque!
AndrejaKo
Emacs admite un montón de buenos métodos de entrada que facilitan la escritura de símbolos Unicode. (Incluyendo uno TeX que es lo que uso). Emacs no es futurista. (Se es impresionante, por supuesto.)
Tikhon Jelvis
2

No dijo qué idioma / compilador está utilizando, pero generalmente la regla para los nombres de variables es que deben comenzar con un carácter alfabético o guión bajo y contener solo caracteres alfanuméricos y guiones bajos. Un Unicode √ no se consideraría alfanumérico, ya que es un símbolo matemático en lugar de una letra. Sin embargo, σ podría ser (ya que está en el alfabeto griego) y á probablemente se consideraría alfanumérico.

tcrosley
fuente
1

Publiqué el mismo tipo de pregunta en StackOverflow

Definitivamente creo que vale la pena usar Unicode en problemas pesados ​​relacionados con las matemáticas, porque hace posible leer la fórmula directamente, lo cual es imposible con ASCII simple.

Imagine una sesión de depuración: por supuesto, siempre puede escribir a mano la fórmula que el código debe calcular para ver si es correcta. Pero el noventa por ciento de las veces, no te molestarás y el error puede permanecer oculto durante mucho tiempo. Y nadie está dispuesto a mirar esta fórmula ASCII simple de 7 líneas. Por supuesto, usar unicode no es tan bueno como una fórmula renderizada por texto, pero es mucho mejor.

La alternativa de usar nombres descriptivos largos no es viable porque en matemáticas, si el identificador no es corto, la fórmula se verá aún más complicada (¿por qué crees que las personas, alrededor del siglo XVIII, comenzaron a reemplazar "más" por "+" y "menos" por "-"?).

Personalmente, también usaría algunos subíndices y superíndices (solo los copio y pego desde esta página ). Por ejemplo: (tenía Python permitido √ como identificador)

√ = math.sqrt #function alias
c² = c**2
σʷ² = σʷ**2
γ² = γ**2
σ′ʷ = √(σʷ² * (1 - (σʷ²/c²)*Wʷⁱⁿ(t, e)) + γ²)

Donde utilicé superíndices porque no hay un subíndice equivalente en Unicode. (Desafortunadamente, el conjunto de caracteres de subíndice Unicode es muy limitado. Espero que algún día, la suscripción en Unicode se considere como signos diacríticos, es decir, una combinación de un carácter para subíndice y otro carácter para la letra con subíndice)

Una última cosa, creo que esta conversación sobre el uso de caracteres no ASCII es principalmente parcial, porque muchos programadores nunca tratan con "notaciones matemáticas intensivas en fórmulas". Entonces piensan que esta pregunta no es tan importante, porque nunca experimentaron una porción significativa de código que requeriría el uso de identificadores no ASCII. Si usted es uno de ellos (y lo era hasta hace poco), considere esto: suponga que la letra "a" no es parte de ASCII. Entonces tendrá una idea bastante buena del problema de no tener ninguna letra griega, subíndice, superíndice al calcular fórmulas matemáticas no triviales.

Bérenger
fuente
0

¿Es este código solo para su proyecto personal? Si es así, enloquece, usa lo que quieras.

¿Este código está destinado a que otros lo usen? es decir, y una aplicación de código abierto de algún tipo? Si es así, es probable que solo esté buscando problemas porque diferentes programadores usan diferentes editores, y no puede estar seguro de que todos los editores admitirán Unicode correctamente. Además, no todos los shells de comandos lo mostrarán correctamente cuando el archivo de código fuente esté tecleado / cat'd, y puede tener problemas si necesita mostrarlo en html.

Gran maestro B
fuente
0

Personalmente, estoy motivado para considerar los lenguajes de programación como una herramienta para los matemáticos en este contexto, ya que en realidad no uso matemáticas que se vean así en mi vida. : D Y claro, ¿por qué no usar ɛ o σ o lo que sea? En ese contexto, en realidad es más legible.

(Aunque, debo decir, mi preferencia sería admitir números de superíndice como llamadas de método directo, no nombres de variables. Por ejemplo, 2² = 2 ** 2 = 4, etc.)

roberto
fuente
-2

¿Qué demonios es σ, lo es W, lo es ε, cy lo que es γ?
Debe nombrar sus variables de una manera que explique cuál es su propósito.
Yo personalmente golpeaba a cualquiera que dejara el Unicode o la versión ASCII para que yo mantuviera, aunque la versión ASCII es mejor.

Lo que es malo es llamar variables σo so sigmao valueo var1, porque esto no transmite ninguna información.

Suponiendo que escriba su código en inglés (como creo que debería hacerlo donde sea que esté), ASCII debería ser suficiente para darles a sus variables nombres significativos, por lo que no hay necesidad real de Unicode.

back2dos
fuente
2
¿Qué pasa si hizo una copia / pegó del papel y luego lo hizo parte de su código fuente como un comentario a pesar de los nombres de las variables de un carácter?
Brian
19
Muchos de estos nombres de variables tienen significados fuertes para aquellos familiarizados con el dominio del problema. Para alguien familiarizado con el dominio, los nombres en inglés pueden ser menos legibles que nombres como sigma o rho.
dsimcha 01 de
3
Me temo que algo así rank_error_with_99_pct_confidencees demasiado largo para esto y en realidad no haría que las fórmulas sean más fáciles de entender. AllegSkill / TrueSkill llama a esos sigma, por lo que creo que es perfectamente aceptable para mí mantener el nombre específico de dominio que tienen.
badp
3
@badp: los buenos nombres son concisos y descriptivos; pero no tiene que ser completamente descriptivo. Para su sigma, es perfectamente bueno usar rank_errory poner el detalle adicional sobre el 99 por ciento de confianza en la documentación / comentario en alguna parte.
Lie Ryan
1
@dsimcha: Creo que aquellos familiarizados con un dominio en particular son significativamente más raros que aquellos que nunca han oído hablar de él. Y creo que los que estén familiarizados con el dominio podrán hacer frente a los nombres simples en inglés, mientras que aquellos que no estén familiarizados con él serán completamente incapaces de entender lo que está sucediendo si todo está ofuscado por las variables griegas de una letra.
back2dos
-2

Para nombres de variables con orígenes matemáticos bien conocidos, esto es absolutamente aceptable, incluso preferido. Pero si alguna vez espera distribuir el código, debe colocar estos valores en un módulo, clase, etc. para que el autocompletado IDE pueda manejar "escribir" los caracteres extraños.

Usar √ o ² en un identificador, no tanto.

rico remer
fuente