I due punti in blocchi Python sono tecnicamente necessari?

14

Questa è davvero solo una domanda teorica da un principiante pitone che vuole capire di più.

Continuo a dimenticare i due punti dopo le istruzioni iniziali del blocco in python. Questi sono ciò che intendo:

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

Il mio pensiero è che uno dei motivi per cui continuo a dimenticare è che sono di fatto impliciti: due punti o meno, la frase termina con quella linea.

La mia domanda - che chiedo per sapere come funziona la sintassi python - è, se il colon è davvero inutile? Dovrei cambiare la sintassi python in modo che i due punti non siano più necessari, qualcosa si romperà? Questo renderebbe alcune affermazioni ambigue o impossibili?

    
posta Tomáš Zato 27.01.2017 - 12:30
fonte

4 risposte

8

Sì, ai due punti è richiesto di disambiguare determinati costrutti. Prendi in considerazione, ad esempio, if x - y < z: pass . Senza i due punti non possiamo decidere come analizzare questo senza conoscere il contesto di ciò che x, ye z sono. if x: -y < z... è valido se x è booleano, if x - y < z: è valido altrimenti.

Poiché è una buona idea che una langauge di programmazione non richieda di eseguire un'applicazione fino al punto che stai compilando per essere in grado di analizzarla, il colon è molto richiesto. Potresti lasciarlo cadere, ma avresti bisogno di altri modi per disambiguare.

    
risposta data 27.01.2017 - 12:58
fonte
13

Il colon non è realmente necessario grammaticalmente, se Python è stato progettato in un mondo diverso, è abbastanza probabile che il designer del linguaggio non possa decidere di richiedere il colon. E infatti lingue come Cobra fanno questo.

Il motivo principale per cui colon è richiesto in python è la leggibilità umana. Per citare da Python FAQ :

Why are colons required for the if/while/def/class statements?

The colon is required primarily to enhance readability (one of the results of the experimental ABC language). Consider this:

if a == b
    print(a)

versus

if a == b:
    print(a)

Notice how the second one is slightly easier to read. Notice further how a colon sets off the example in this FAQ answer; it’s a standard usage in English.

Another minor reason is that the colon makes it easier for editors with syntax highlighting; they can look for colons to decide when indentation needs to be increased instead of having to do a more elaborate parsing of the program text.

Come indicato anche nelle FAQ, i due punti rendono anche più semplice l'elaborazione del codice Python senza un'analisi completa della lingua. Qualsiasi elaboratore di testi che abbia un parser completo, incluso il compilatore python, può fare a meno dei due punti se non è richiesto o se è reso facoltativo quando non ambiguo.

    
risposta data 27.01.2017 - 14:31
fonte
9

Non è necessario per il computer, ma per gli esseri umani.

Guido van Rossum (creatore di Python) ha avuto un blog di storia di Python per un po '. I due punti sono stati introdotti in ABC , la fonte di molte delle funzionalità di Python.

In questo post del blog su "Karin Dewar, indentazione e il colon ", scrive Guido:

And here I will paraphrase, at Lambert's request.

In 1978, in a design session in a mansion in Jabłonna (Poland), Robert Dewar, Peter King, Jack Schwartz and Lambert were comparing various alternative proposed syntaxes for B, by comparing (buggy) bubble sort implementations written down in each alternative. Since they couldn't agree, Robert Dewar's wife was called from her room and asked for her opinion, like a modern-day Paris asked to compare the beauty of Hera, Athena, and Aphrodite. But after the first version was explained to her, she remarked: "You mean, in the line where it says: 'FOR i ... ', that it has to be done for the lines that follow; not just for that line?!" And here the scientists realized that the misunderstanding would have been avoided if there had been a colon at the end of that line.

( B ecco una serie di linguaggi prototipo B0, B1, ... che hanno portato alla ABC. Non è il linguaggio B che è il predecessore di C).

Ricordo anche che Guido sottolineò negli anni '90 che era a beneficio degli editor , che possono inserire automaticamente un rientro dopo una riga che termina con due punti. Ma non ho ancora trovato una fonte per questo.

    
risposta data 27.01.2017 - 14:26
fonte
2

La sintassi Cobra Programming Language è strongmente ispirata a Python e fa sparire i due punti, quindi sembra che non è strettamente necessario. Tuttavia, non è sufficiente solo rimuovere i due punti, ci sono altre modifiche alla sintassi necessarie. Vedi, ad esempio questo pezzo di codice da uno dei miei progetti fai da te :

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

Senza i due punti per separare il corpo dall'elenco dei parametri, dovrei usare il rientro:

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

virst = lambda l
    l(True )

rrest = lambda l
    l(False)

Credo che le versioni precedenti di Cobra rendessero opzionale il colon, potevi usare sia il rientro che i due punti o entrambi. Simile a come funziona in Ruby, dove ci sono parole chiave per separare le diverse parti delle espressioni di controllo, ma puoi anche usare separatori di espressioni (punto e virgola o nuova riga):

# 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

Nelle attuali versioni di Cobra, puoi usare una virgola:

if x
    y

può essere scritto come

if x, y

Hai bisogno di qualche modo per separare le diverse parti delle espressioni di controllo o delle definizioni. In Python, questo è il colon. Se rimuovi i due punti, devi sostituirlo con qualcos'altro, ad es. rientro forzato . Solo la rimozione dei due punti non funzionerà.

L'unico modo per essere assolutamente sicuri è formalizzare la sintassi con e senza colon e dimostrare la sua non ambiguità.

Nota, tuttavia, che uno degli aforismi dello Zen di Python è "Esplicito è meglio di Implicito ", quindi la delineazione esplicita di blocchi con due punti sembra adattarsi alla filosofia generale di Python. Design e storia Le FAQ menzionano inoltre che questa decisione si basa su prove empiriche fornite dal predecessore di Python, ABC.

    
risposta data 27.01.2017 - 12:52
fonte

Leggi altre domande sui tag