¿Es el colon en bloques de pitón técnicamente necesario?

19

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

Sigo olvidando los dos puntos después de las declaraciones iniciales de bloque en python. A eso me refiero:

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

Mi pensamiento es que una de las razones por las que sigo falsificando es que están implícitas de facto: dos puntos o no, la declaración termina con esa línea.

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

Tomáš Zato - Restablece a Monica
fuente
44
Creo que no comprende la pregunta, que es si los dos puntos son necesarios para que la sintaxis funcione. Además, no importa cuál sea su respuesta, también debe contener una explicación.
Tomáš Zato - Restablece a Mónica el
Probablemente, ¿puede reformular partes de la pregunta, para que pueda beneficiarme de su comprensión de este asunto, tal vez un ejemplo? Serías el mejor juez, creo que no tengo idea de tu intención de preguntar. ¿Lo dices a nivel del analizador del intérprete / compilador? Gracias un montón.
bhan sur
No sé cómo expresarlo mejor. Mi pregunta es, básicamente, si pudiera cambiar toda la sintaxis de Python para que ya no necesita dos puntos después de if, else, whiley así sucesivamente. Si hicieras eso, ¿Python seguiría siendo un lenguaje que se pueda usar sin ambigüedad?
Tomáš Zato - Restablece a Mónica el
¡Entendido! Es una pregunta sobre las decisiones de diseño de sintaxis de Python . Lo siento, lo entendí mal. Gracias por explicarlo.
bhan sur
Especulando Es como si los saltos de línea fueran más difíciles de detectar por los intérpretes / analizadores en la práctica o si existen legibilidad. En LUA puedes escribir if .. then .. enden una sola línea. Entonces aquí en python thense sustituye por dos cosas a :y una nueva línea requerida. Uno de estos parece redundante.
bhan sur

Respuestas:

9

Sí, se requieren 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, el colon es muy necesario. Podría soltarlo, pero necesitaría otras formas de desambiguar.

Phoshi
fuente
1
Espera, ¿puedes tener una declaración después de los dos puntos en la misma línea? Estaba bastante seguro de que no está permitido.
Tomáš Zato - Restablece a Mónica el
1
Está permitido, pero solo con un salto de línea después.
Phoshi
Todavía un poco confundido. ¿Esto está permitido: if condition: print("Condition passed")\npermitido? El \nsimboliza nueva línea después de la declaración de impresión.
Tomáš Zato - Restablece a Mónica el
Claro, solo inténtalo.
RemcoGerlich
1
@TomasZato: sí, puede tener declaraciones después de los dos puntos. Inmediatamente termina el bloque, por lo que es principalmente útil cuando el bloque es pequeño.
Lie Ryan
14

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, idiomas como Cobra hacen esto.

La razón principal por la cual se requiere colon en Python es la legibilidad humana. Para citar las preguntas frecuentes de Python :

¿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 ABC experimental). 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. Observe más a fondo cómo los dos puntos establecen 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 a 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 detallado 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 lenguaje. 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 se hace opcional cuando no es ambiguo.

Lie Ryan
fuente
3
"Observe cómo el segundo es un poco más fácil de leer". Creo que el primero es más fácil de leer. Menos ruido.
user76284
10

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 de blog sobre "Karin Dewar, la sangría y el colon" , Guido escribe:

Y aquí 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 compararon varias sintaxis propuestas alternativas para B, comparando implementaciones de tipo burbuja (con errores) escritas en cada alternativa. Como no podían estar de acuerdo, llamaron a la esposa de Robert Dewar desde su habitación y le pidieron su opinión, como en un París moderno que compara la belleza de Hera, Atenea y Afrodita. Pero después de que se le explicó la primera versión, ella comentó: "¿Quieres decir, en la línea donde dice: 'PARA YO ...', que debe hacerse para las líneas que siguen, no solo para esa línea? ! " Y aquí los científicos se dieron cuenta de que el malentendido se habría evitado si hubiera habido un colon al final de esa línea.

( B aquí es una serie de prototipos de lenguajes B0, B1, ... que condujeron a ABC. No es el lenguaje B el predecesor de C).

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

RemcoGerlich
fuente
4

La sintaxis del lenguaje de programación Cobra está muy inspirada en Python y elimina el colon, por lo que parece que no es estrictamente necesario. Sin embargo, no es suficiente simplemente eliminar el colon, hay otros cambios en la sintaxis necesaria. Vea, por ejemplo, este código de uno de mis proyectos de juguetes :

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 el colon fuera opcional, podría usar sangría o un colon 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 expresión (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, puede usar una coma:

if x
    y

Se puede escribir como

if x, y

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

La única forma de estar absolutamente seguro es formalizar la sintaxis con y sin dos puntos y demostrar 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. Las preguntas frecuentes sobre diseño e historia también mencionan que esta decisión se basa en evidencia empírica del predecesor de Python, ABC.

Jörg W Mittag
fuente
3
Bueno, con esa filosofía descrita en el último párrafo, podría requerir dos puntos al final de cada línea. Explícito vs implícito solo tiene sentido si explícito realmente agrega información (por ejemplo, la variante implícita es ambigua). Cuál era el punto de mi pregunta.
Tomáš Zato - Restablece a Mónica el