Perché python non fornisce tipi opzionali?

1

Recentemente ho usato il dattiloscritto e penso che la capacità di menzionare o meno i tipi sia ottima. Riduce notevolmente i tempi di debug e ti offre anche i vantaggi di un linguaggio non tipizzato. Potrei immaginare un superset di linguaggio Python con le stesse funzionalità, sono sicuro che le specifiche del tipo potrebbero essere utilizzate per accelerare notevolmente il tempo di esecuzione riducendo al contempo il trambusto del debug. Cosa ne pensi?

    
posta user3091275 24.06.2016 - 11:24
fonte

2 risposte

4

Non so se TypeScript impone vincoli di tipo in fase di compilazione o di esecuzione. Ma fa Python supporta i suggerimenti sui tipi.

Python 3.0 introdusse annotazioni di funzioni come definito in PEP 3107 . Funzionano così:

def log_in(login: 'Login', password: 'Password') -> 'Return value':
    # ...

log_in.func_annotation['login'] # => 'Login'
log_in.func_annotation['password'] # => 'Password'
log_in.func_annotation['return'] # => 'Return value'

Puoi annotare i parametri e il valore di ritorno con qualsiasi oggetto.

Questo può essere usato per implementare suggerimenti tipo. Python 3.5 introduce il modulo typing . Puoi implementare un decoratore che esegua il controllo del tipo di runtime.

    
risposta data 24.06.2016 - 11:34
fonte
0

I'm sure the type specifications could be used to greatly speed up the runtime […]

No, non possono. La definizione di un sistema di tipi facoltativo è che non influisce in alcun modo sul comportamento di runtime. Questo è ciò che rende "opzionale" in primo luogo. Se l'aggiunta o la rimozione di tipi ha reso il programma modificarne il comportamento, i tipi non sarebbero facoltativi.

Nota anche che non hai bisogno di cambiare Python in alcun modo per digitarlo. Potresti semplicemente scrivere le tue annotazioni di tipo nei commenti, dopotutto. Quello che fai bisogno è ovviamente un sistema di tipi con regole di digitazione. Quindi, è necessario dimostrare questo sistema di tipo corretto e corretto (se sei interessato alla solidità, che, ammettiamolo, lo sei, altrimenti non ti interesserebbe un sistema di tipi per cominciare). Quindi è necessario scrivere un typechecker per questo sistema di tipi. E una volta fatto ciò, e dimostrato il suo valore, allora puoi parlare di aggiungere il tuo sistema di tipi alla lingua stessa e aggiungere anche la sintassi di annotazione del tipo.

[Si noti che, almeno per i parametri di funzione e i valori di ritorno, esiste già il supporto per la sintassi di annotazione del tipo.]

Questo è già molto difficile. Ma non è nemmeno la parte interessante: ora hai creato un nuovo linguaggio, tipizzato staticamente. Ma non puoi aspettarti che tutti digitino staticamente il loro codice Python tutto in una volta. (Ricorda quanto tempo è trascorso il passaggio a Python3 ... ehm ... sta ancora prendendo?) Quello che veramente vuole è un modo per migrare gradualmente alla tipizzazione statica, o avere parti del codice tipizzate staticamente e parti dinamicamente.

Un modo per risolvere questo problema, sarebbe quello di trovare uno schema di inferenza di tipo che possa inferire automaticamente i tipi statici corretti dal programma, in modo da non dover fare affidamento sul codice Python legacy per essere annotati. Ora, typechecking Python senza violare i suoi idiomi sarà già abbastanza difficile con l'aiuto delle annotazioni di tipo statico, immagina solo quanto sarà difficile senza !

Quindi, l'altro modo è quello che viene chiamato "digitazione graduale", un modo per mescolare staticamente il codice di sicurezza del tipo e digitato in modo dinamico in modo tale che

  • possono interoperare perfettamente,
  • il codice digitato in modo dinamico non può violare il tipo di sicurezza del codice di sicurezza statico del tipo e
  • il codice digitato in modo dinamico può essere gradualmente migrato in codice staticamente sicuro al tipo aggiungendo gradualmente annotazioni.

C'è molta ricerca sulla digitazione graduale, e in effetti, gran parte della ricerca originale è stata (e si sta facendo) in e su Python, e una implementazione della ricerca di digitazione graduale per la digitazione in Jython è esistita per un po 'di tempo.

Dovresti dargli un po 'di tempo. Vi è ancora dibattito sulla possibilità che la digitazione graduale o la digitazione opzionale (o il percorso intrapreso dalla community di Racket con il loro approccio alternativo alla digitazione graduale chiamata soft typing), una combinazione dei due (e ci siano di nuovo idee diverse su come sarebbe una tale combinazione come), o qualcosa di completamente diverso è la strada da percorrere. La digitazione graduale è ancora un argomento di ricerca in evoluzione.

Oltre alla digitazione graduale di Jeremy Siek in Jython, c'era anche un progetto di ricerca per un Ruby tipicamente e tipizzato in modo statico (Diamondback Ruby), e c'era ECMAScript4. C'è il Racket digitato (e clojure.typed, che è basato sul primo). Abbiamo avuto il sistema opzionale Strongtalk per Smalltalk. Ma non abbiamo ancora capito tutto.

tl; dr :

Why python doesn't provide optional types?

Perché nessuno ha ancora finito il lavoro.

    
risposta data 24.06.2016 - 12:40
fonte

Leggi altre domande sui tag