2010-01-14 17 views
15

Siempre me he preguntado por qué no podemos utilizar guiones entre los nombres de funciones y nombres de variables en PythonPor qué Python no permite guiones

Habiendo probado lenguajes de programación funcionales como Lisp y Clojure, donde se permiten guiones. Por qué Python no hace eso.

# This won't work -- SyntaxError 
def is-even(num): 
    return num % 2 

# This will work 
def is_even(num): 
    return num % 2 

Estoy seguro de que Sir Guido debe haber hecho esto por alguna razón. Busqué en Google pero no pude encontrar la respuesta. ¿Alguien puede arrojar algo de luz sobre esto?

+0

Ese error de sintaxis se debe a que 'is' es una palabra clave. En 'def mightbe-even (num)', el error de sintaxis se debe al guión. – balpha

+0

Siempre me he preguntado por qué ASCII tiene "-" y "_". Mientras se pregunta acerca de los usos para "-", ¿podría preguntarse también sobre los usos para "_"? De hecho, tengo muchas preguntas de puntuación que son tan importantes como esta. ¿Por qué el "#" y el "♯" son diferentes? ¿Puedes preguntarte sobre eso, también? Siempre me ha parecido extraño que no podamos usar "♯" para comentarios. –

+0

(@aatifh, por favor, consulte http://meta.stackexchange.com/questions/35582/information-revision-informativista) ¿Cambió la etiqueta de 'pyhon' a' python'? Y tal vez también eliminó un backtick final en ¿el título?) – Arjan

Respuesta

35

Porque el guion se usa como el operador de resta. Imagine que podría tener una función is-even, y luego tenías código como este:

my_var = is-even(another_var) 

Es is-even(another_var) una llamada a la función is-even, o es restar el resultado de la función even de una variable llamada is ?

Los dialectos Lisp no tienen este problema, ya que utilizan la notación de prefijo. Por ejemplo, hay una diferencia clara entre

(is-even 4) 

y

(- is (even 4)) 

en Lisp.

+8

En cuanto a Lisp, el aspecto del prefijo es irrelevante; la diferencia es más bien que "-" no se considera necesariamente una ficha separada; cualquier combinación de letras y puntuación "ordinaria" (por ejemplo, "no") ") puede constituir un único token. Un lenguaje infijo podría funcionar perfectamente con tales reglas; entonces "' is-even (another_var) '" sería una llamada a la función y "' is - even (another_var) '" sería la resta, al igual que en Lisps '(is - even 4)' es una expresión s diferente de '(is-even 4)'. –

+0

Lisp no tiene este problema porque "-" es solo un personaje. –

+0

Veo que '-' debe usarse para el operador menos y que la notación infija es buena para la legibilidad (para aquellos que no crecieron con las calculadoras de notación de prefijo). Sin embargo, ¿hay alguna razón convincente para permitir la ausencia de espacios en blanco alrededor del operador negativo y de otros operadores? Viendo que el espacio en blanco ya es significativo en Python, ¿por qué no forzar el uso del espacio en blanco alrededor de los operadores que permitiría el uso de guiones en los nombres, que en mi opinión es una convención mucho más legible y fácil de escribir que under_score y camelWTFCase, que aversión en cantidades iguales. –

7

Porque haría el analizador aún más complicado. También sería confuso para los programadores.

Considere def is-even(num):: ahora, si is es una variable global, ¿qué ocurre?

También tenga en cuenta que el - es el operador de resta en Python, por lo tanto, complicaría aún más el análisis.

0
is-even(num) 

¿contiene un guión? Pensé que era una resta del valor devuelto por la función incluso con el argumento num del valor de es.

Como dice @jdupont, el análisis puede ser complicado.

Marcos

+0

'is' es una palabra clave, no puede tener un valor :) – balpha

+1

El análisis puede ser complicado. Restar un valor de una palabra clave es probable que haga que el analizador se queje. –

9

Debido a que Python usa la notación infija para representar cálculos y un guión y un signo menos tiene exactamente el mismo código ASCII. Puede tener casos ambiguos como:

a-b = 10 
a = 1 
b = 1 

c = a-b 

¿Cuál es la respuesta? 0 o 10?

+0

Tengo este. Parece muy recto. Cualquier lenguaje que tenga notación infija no puede usar guiones. Los guiones solo están permitidos en el lenguaje que admite la expresión S. :) – aatifh

+1

Bueno, un lenguaje de programación cuyo propio conjunto de caracteres es Unicode (vienen) podría distinguir fácilmente entre un guión y un signo menos. El problema es que demasiados idiomas no pueden distinguir, en sus conjuntos de caracteres, entre guiones y signos negativos. Es la pobreza del conjunto de personajes, no la pobreza de la expresividad. –

+0

Tiene razón, aunque esa habilidad sería desagradable si alguien la aprovechara y la usara en sus identificadores. – JPvdMerwe

Cuestiones relacionadas