I due punti nei blocchi di pitone sono tecnicamente necessari?


19

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

Continuo a dimenticare i due punti dopo le dichiarazioni iniziali di 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, l'affermazione termina con quella linea.

La mia domanda - che faccio per capire come funziona la sintassi di Python - è se i due punti non sono davvero necessari? Se dovessi cambiare la sintassi di Python in modo che i due punti non siano più necessari, qualcosa si spezzerebbe? Ciò renderebbe alcune affermazioni ambigue o impossibili?


4
Penso che tu non capisca la domanda, ovvero se i due punti sono necessari per far funzionare la sintassi. Inoltre, qualunque sia la tua risposta, dovrebbe contenere anche una spiegazione.
Tomáš Zato - Ripristina Monica il

Probabilmente, puoi riformulare parti della domanda, in modo che io possa beneficiare della tua comprensione di questa faccenda, forse un esempio? Saresti il ​​miglior giudice, penso di non avere idea della tua intenzione di chiedere. Intendi a livello di parser interprete / compilatore? Grazie mille.
Bhan sur

Non so come esprimerlo meglio. La mia domanda è fondamentalmente, se si potesse cambiare tutto sintassi di Python in modo che esso non ha più bisogno dei due punti dopo if, else, whilee così via. Se lo facessi, Python sarebbe ancora un linguaggio che può essere usato senza ambiguità?
Tomáš Zato - Ripristina Monica il

Fatto! È una domanda sulle decisioni di progettazione della sintassi di Python . Siamo spiacenti, ho capito male. Grazie per aver spiegato.
Bhan sur

Speculare. È come se le interruzioni di linea fossero più difficili da rilevare da parte degli interpreti / parser nella pratica o fossero lì per essere leggibili. In LUA puoi scrivere if .. then .. endsu una sola riga. Quindi qui in Python thenè sostituito da due cose :ae una riga richiesta. Uno di questi sembra ridondante.
Bhan sur

Risposte:


9

Sì, i due punti sono necessari per chiarire alcuni costrutti. Considera, ad esempio if x - y < z: pass,. Senza i due punti non possiamo decidere come analizzarlo senza conoscere il contesto di cosa sono x, ye z. if x: -y < z...è valido se x è booleano, if x - y < z:altrimenti è valido.

Poiché è una buona idea che un linguaggio di programmazione non richieda l'esecuzione di un'applicazione fino al punto che stai compilando per essere in grado di analizzarla, i due punti sono molto richiesti. Potresti lasciarlo cadere, ma avresti bisogno di altri modi per chiarire le ambiguità.


1
Aspetta, puoi avere una dichiarazione dopo i due punti sulla stessa linea? Ero abbastanza sicuro che non fosse permesso.
Tomáš Zato - Ripristina Monica il

1
È consentito, ma solo con un'interruzione di riga dopo di esso.
Phoshi,

Ancora un po 'confuso. È permesso: if condition: print("Condition passed")\npermesso? Il \nsimbolo simboleggia la nuova riga dopo l'istruzione print.
Tomáš Zato - Ripristina Monica il

Certo, provalo.
Remco Gerlich,

1
@TomasZato: sì, puoi avere delle dichiarazioni dopo i due punti. Termina immediatamente il blocco, quindi è utile soprattutto quando il blocco è piccolo.
Sdraiati Ryan il

14

I due punti non sono veramente necessari dal punto di vista grammaticale, se Python fosse stato progettato in un mondo diverso, è abbastanza concepibile che il progettista del linguaggio potrebbe non decidere di richiedere i due punti. E in effetti lingue come Cobra lo fanno.

Il motivo principale per cui i due punti sono richiesti in Python è la leggibilità umana. Per citare dalle FAQ di Python :

Perché sono richiesti due punti per le istruzioni if ​​/ while / def / class?

I due punti sono richiesti principalmente per migliorare la leggibilità (uno dei risultati del linguaggio sperimentale ABC). Considera questo:

if a == b
    print(a)

contro

if a == b:
    print(a)

Nota come il secondo è leggermente più facile da leggere. Notare ulteriormente come i due punti danno l'esempio in questa risposta alle FAQ; è un uso standard in inglese.

Un altro motivo secondario è che i due punti rendono più semplice per gli editor l'evidenziazione della sintassi; possono cercare due punti per decidere quando è necessario aumentare il rientro invece di dover eseguire un'analisi più elaborata del testo del programma.

Come menzionato anche nelle FAQ, i due punti facilitano anche l'elaborazione del codice Python senza analizzare completamente la lingua. Qualsiasi elaboratore di testo che ha un parser completo, incluso il compilatore python, può fare a meno dei due punti se non fosse richiesto o se reso facoltativo quando non ambiguo.


3
"Nota come il secondo è leggermente più facile da leggere." Trovo il primo più facile da leggere. Meno rumore.
user76284

10

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

Guido van Rossum (creatore di Python) ha avuto un blog di storia di Python per un po '. Il colon è stato introdotto in ABC , la fonte di molte funzionalità di Python.

In questo post sul blog "Karin Dewar, Indentation and the Colon" , Guido scrive:

E qui parafraserò, su richiesta di Lambert.

Nel 1978, in una sessione di progettazione in una villa a Jabłonna (Polonia), Robert Dewar, Peter King, Jack Schwartz e Lambert stavano confrontando varie sintassi proposte alternative per B, confrontando le implementazioni (buggy) di ordinamento a bolle scritte in ciascuna alternativa. Dal momento che non potevano essere d'accordo, la moglie di Robert Dewar fu chiamata dalla sua stanza e chiese la sua opinione, come una Parigi moderna chiese di confrontare la bellezza di Hera, Atena e Afrodite. Ma dopo che le è stata spiegata la prima versione, ha osservato: "Intendi, nella riga in cui si dice:" FOR i ... ", che deve essere fatto per le righe che seguono; non solo per quella riga? !" E qui gli scienziati hanno capito che l'incomprensione sarebbe stata evitata se ci fosse stato un colon alla fine di quella linea.

( B qui è una serie di prototipi di linguaggi B0, B1, ... che hanno portato all'ABC. Non è il linguaggio B che è il predecessore di C).

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


4

La sintassi del linguaggio di programmazione Cobra è fortemente ispirata a quella di Python e elimina i due punti, quindi sembra che non sia strettamente necessario. Tuttavia, non è sufficiente rimuovere solo i due punti, sono necessarie altre modifiche alla sintassi. Vedi, ad esempio, questo pezzo di codice di uno dei miei progetti di giocattoli :

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 facoltativo il colon, potevi usare il rientro o un colon 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 i separatori di espressioni (punto e virgola o newline):

# 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 versioni attuali di Cobra, puoi usare una virgola:

if x
    y

può essere scritto come

if x, y

È necessario un modo per separare le diverse parti delle espressioni o definizioni di controllo. 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 due punti e dimostrarne la non ambiguità.

Si noti, tuttavia, che uno degli aforismi dello Zen di Python è "Explicit è meglio di Implicit", quindi la delimitazione esplicita di blocchi con due punti sembra adattarsi alla filosofia generale di Python. Le domande frequenti su design e storia menzionano anche che questa decisione si basa su prove empiriche del predecessore di Python, ABC.


3
Bene, con quella filosofia descritta nell'ultimo paragrafo, potresti richiedere i due punti alla fine di ogni riga. Esplicito vs implicito ha senso solo se esplicito aggiunge effettivamente informazioni (ad es. La variante implicita è ambigua). Qual era il punto della mia domanda.
Tomáš Zato - Ripristina Monica il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.