¿Son los dos puntos en los bloques de python técnicamente necesarios?

14

Esta es solo una pregunta teórica de un novato de python que quiere entender más.

Sigo olvidando los dos puntos después de las instrucciones iniciales del bloque en python. Eso es lo que quiero decir:

  • for <variable> in <sequence>:
  • if <blah blah>:

Mi pensamiento es que una razón por la que siempre me olvido es que están implícitas de facto: dos puntos o no, la declaración termina con esa línea.

Mi pregunta, que pregunto para saber cómo funciona la sintaxis de Python, es si el colon es realmente innecesario. Si tuviera que cambiar la sintaxis de python para que el colon ya no sea necesario, ¿se rompería algo? ¿Eso haría algunas declaraciones ambiguas o imposibles?

    
pregunta Tomáš Zato 27.01.2017 - 12:30

4 respuestas

8

Sí, se requieren los dos puntos para desambiguar ciertas construcciones. Considere, por ejemplo, if x - y < z: pass . Sin los dos puntos no podemos decidir cómo analizar esto sin conocer el contexto de lo que son x, y y z. if x: -y < z... es válido si x es booleano, if x - y < z: es válido de lo contrario.

Como es una muy buena idea que un lenguaje de programación no requiera que ejecutes una aplicación hasta el punto que estás compilando para poder analizarla, los dos puntos son muy necesarios. Podría dejarlo, pero necesitaría otras formas de desambiguar.

    
respondido por el Phoshi 27.01.2017 - 12:58
13

El colon no es realmente necesario gramaticalmente, si Python hubiera sido diseñado en un mundo diferente, es bastante concebible que el diseñador del lenguaje no decida requerir el colon. Y, de hecho, lenguajes como Cobra hacen esto.

La razón principal por la que se requiere el colon en python es la legibilidad humana. Para citar de Python Preguntas frecuentes :

  

¿Por qué se requieren dos puntos para las declaraciones if / while / def / class?

     

El colon se requiere principalmente para mejorar la legibilidad (uno de los resultados del lenguaje experimental ABC). Considera esto:

if a == b
    print(a)
     

versus

if a == b:
    print(a)
     

Observe cómo el segundo es un poco más fácil de leer. Tenga en cuenta además cómo dos puntos ponen de relieve el ejemplo en esta respuesta de Preguntas frecuentes; es un uso estándar en inglés.

     

Otra razón menor es que los dos puntos facilitan la tarea de los editores con resaltado de sintaxis; pueden buscar dos puntos para decidir cuándo se debe aumentar la sangría en lugar de tener que hacer un análisis más elaborado del texto del programa.

Como también se menciona en las Preguntas frecuentes, los dos puntos también facilitan el procesamiento del código de Python sin analizar completamente el idioma. Cualquier procesador de texto que tenga un analizador completo, incluido el compilador de Python, puede prescindir de los dos puntos si no fuera necesario o si es opcional si no es ambiguo.

    
respondido por el Lie Ryan 27.01.2017 - 14:31
9

No es necesario para la computadora, sino para los humanos.

Guido van Rossum (creador de Python) tuvo un blog de historia de Python por un tiempo. El colon se introdujo en ABC , la fuente de muchas de las características de Python.

En esta publicación del blog sobre "Karin Dewar, sangría y el colon ", escribe Guido:

  

Y aquí voy a parafrasear, a petición de Lambert.

     

En 1978, en una sesión de diseño en una mansión en Jabłonna (Polonia), Robert   Dewar, Peter King, Jack Schwartz y Lambert comparaban varios   sintaxis propuestas alternativas para B, comparando la clasificación de burbuja (con errores)   Implementaciones escritas en cada alternativa. Ya que no pudieron   de acuerdo, la esposa de Robert Dewar fue llamada desde su habitación y le preguntó por ella   opinión, como un moderno París pidió comparar la belleza de Hera,   Atenea, y Afrodita. Pero después de la primera versión se explicó a   ella, remarcó: "Quieres decir, en la línea donde dice: 'PORQUE ...',   que tiene que hacerse para las líneas que siguen; no solo por eso   línea ?! "Y aquí los científicos se dieron cuenta de que el malentendido   habría sido evitado si hubiera habido dos puntos al final de ese   línea.

( B aquí hay una serie de lenguajes prototipo B0, B1, ... que llevaron a ABC. No es el lenguaje B el que es el antecesor de C).

También recuerdo que Guido señaló en los años 90 que era para el beneficio de editors , que puede insertar una sangría automáticamente después de una línea que termina con dos puntos. Pero todavía no he encontrado una fuente para eso.

    
respondido por el RemcoGerlich 27.01.2017 - 14:26
2
La sintaxis del Cobra Programming Language está muy inspirada en Python's, y elimina el colon, por lo que parece que No es estrictamente necesario. Sin embargo, no es suficiente simplemente eliminar los dos puntos, hay otros cambios en la sintaxis necesarios. Ver, por ejemplo este fragmento de código de uno de mis toy projects :

kons  = lambda hd, tl: lambda x: hd if x else tl
virst = lambda l: l(True )
rrest = lambda l: l(False)

Sin los dos puntos para separar el cuerpo de la lista de parámetros, tendría que usar sangría:

kons  = lambda hd, tl
    lambda x
        hd if x else tl

virst = lambda l
    l(True )

rrest = lambda l
    l(False)

Creo que las versiones anteriores de Cobra hicieron que los dos puntos fueran opcionales, podría usar sangría o dos puntos o ambos. Similar a cómo funciona en Ruby, donde hay palabras clave para separar las diferentes partes de las expresiones de control, pero también puede usar separadores de expresiones (punto y coma o nueva línea):

# idiomatic
while true do puts "I am awesome" end
#          ↑↑

# non-idiomatic, but legal
while true; puts "I am awesome" end
#         ↑

# non-idiomatic, but legal
while true
puts "I am awesome" end

# idiomatic
while true
  puts "I am awesome"
end

En las versiones actuales de Cobra, puedes usar una coma:

if x
    y

se puede escribir como

if x, y

Necesita alguna forma de separar las diferentes partes de las expresiones de control o las definiciones. En Python, ese es el colon. Si elimina el colon, debe reemplazarlo con otra cosa, por ejemplo, forzado sangría. Solo eliminar los dos puntos no funcionará.

La única forma de estar absolutamente seguro es formalizar la sintaxis con y sin los dos puntos y probar su no ambigüedad.

Sin embargo, tenga en cuenta que uno de los aforismos del Zen de Python es "Explícito es mejor que Implícito ", por lo que la delineación explícita de bloques con dos puntos parece encajar con la filosofía general de Python. El Diseño e historia Las Preguntas frecuentes también mencionan que esta decisión se basa en evidencia empírica del antecesor de Python, ABC.

    
respondido por el Jörg W Mittag 27.01.2017 - 12:52

Lea otras preguntas en las etiquetas