Perché Python e Ruby non fanno una distinzione tra dichiarare e assegnare un valore alle variabili?

8

Due dei più famosi linguaggi di scripting dinamici, Python e Ruby, non distinguono la sintassi tra la dichiarazione di una variabile e l'assegnazione di un valore ad essa.

Questo è in entrambe le lingue, dichiarando una variabile n e assegnando un valore ad esso apparirebbe così:

n = 10

E assegnare un nuovo valore alla variabile in seguito apparirebbe lo stesso.

Questo crea due problemi principali:

  1. Un errore di battitura nel nome di una variabile quando si modifica il suo valore creerebbe una nuova variabile e causerebbe bug.

  2. Rende le intenzioni del codice meno chiare. Difficile sapere dove viene dichiarata e utilizzata una variabile, potrebbe rendere il codice più confuso.

Ciò che non capisco è il motivo per cui questi linguaggi non hanno una parola chiave var da utilizzare sulla dichiarazione, per fare una distinzione tra una dichiarazione e un compito. Questo non rende la lingua digitata meno dinamicamente, e non vedo alcun inconveniente.

Qual è il vantaggio di non dover definire esplicitamente una variabile?

    
posta Aviv Cohn 19.07.2014 - 21:49
fonte

2 risposte

4

Come utente, piuttosto che come designer, di Python ci sono tre motivi per cui sono contento di queste decisioni:

Principalmente, si legge meglio. Ovviamente, devo decidere consapevolmente di introdurre una nuova variabile quando scrive , ma il codice viene letto molto più spesso di quanto non sia scritto. Un sacco di codice è semplice nel senso che il controllo del flusso e della nidificazione non ha alcuna influenza sul significato e sull'esistenza delle variabili. Quando leggo

it = Snark()
message = "A letter, not signed"
if random.random() > 0.5:
    hunt(it)
    message += " (by the Knave)"
return [it, message]

quindi di solito non mi interessa davvero quale (se del caso) menzione di un nome lo introduce per la prima volta, mi interessa solo che sia lì e che cosa accada.

Si noti che un corpo significativo di pseudo-codice usa la stessa convenzione (nessuna dichiarazione, introduzione implicita tramite assegnazione) e Python è spesso descritto come pseudo-codice eseguibile, solo per metà scherzoso. Quattro caratteri extra per la variabile locale ogni , ai miei occhi viziati, si sentono come un disordine significativo nel contesto di Python, specialmente quando non sento come se aggiungesse qualsiasi valore (vedi sotto); questo sarebbe diminuito da un operatore := come in Go.

In secondo luogo, devo ancora incontrare un errore di battitura (dovuto a questa caratteristica specifica) che non si è mostrato anche in un altro modo chiaro. Forse cambierò idea in qualche altro anno in cui ho incontrato alcuni bug di questo tipo, ma finora è molto, molto in basso nella mia lista di cose che causano bug. C'è un buon numero di domande su UnboundLocalError ed è un po 'complicato da spiegare ai principianti, ma la frequenza e la popolarità di queste domande, rispetto ad altri trucchi (parametri di default mutabili, semantica di riferimento, variabili di classe vs istanza) indica che è un raro problema.

Finalmente, l'intento ... scusa ma non riesco davvero a capirlo. Durante la lettura e la scrittura di Python, è sempre perfettamente chiaro: ciò a cui si assegna è inteso come locale, a meno che non sia dichiarato esplicitamente e in modo esplicito. Nessuna domanda al riguardo. Inoltre, poiché (almeno in Python) una variabile è locale per la funzione intera o per nulla , non puoi avere codice complicato che usa una variabile locale in un ramo e uno globale in un altro. Vedi un nome assegnato? Saprai immediatamente che era sempre locale dall'inizio. Bene, a meno che il codice non sia spezzato in un modo molto speciale (e lanciamo il temuto UnboundLocalError in fase di esecuzione, quando si inseriscono quei casi).

    
risposta data 20.07.2014 - 01:38
fonte
-3

Non è che la definizione di una variabile equivale all'assegnazione ad essa - è che le variabili non sono affatto definite. Si chiama Digitazione dinamica .

Non puoi avere un linguaggio tipizzato dinamicamente che ti permetta di definire una variabile, perché è ciò che la tipizzazione dinamica è .

La decisione di fare ciò cambia completamente la natura del parser e produce un tipo di linguaggio completamente diverso. La principale differenza per l'utente finale è solitamente che, quando si definisce una funzione, i parametri risultano essere di qualsiasi tipo ("duck typing"), che è sia una benedizione, in quanto rende il codice molto più semplice, e una maledizione, in quanto consente una moltitudine di nuovi modi in cui il tuo codice può fallire.

Non sono un esperto di compilatori, ma penso che sia anche vero che la digitazione dinamica ha implicazioni importanti per il sapore di OOP che si ottiene in una lingua.

    
risposta data 07.11.2014 - 14:39
fonte

Leggi altre domande sui tag