2016-03-10 10 views
5

Sto cercando di annotare il mio codice con i tipi, ma sono un po 'confuso quando parliamo di set. Ho letto alcuni punti in PEP 484:Quali sono le differenze tra Set, FrozenSet, MutableSet e AbstractSet nel modulo di dattilografia python?

Nota: Dict, List, Set e FrozenSet sono principalmente utili per l'annotazione dei valori di ritorno. Per gli argomenti, preferisci i tipi di raccolta astratti definiti di seguito, ad es. Mapping, Sequence o AbstractSet.

e

Set, rinominato AbstractSet. Questa modifica del nome era necessaria perché Impostare nel modulo di digitazione significa set() con generici.

ma questo non aiuta.

La mia prima domanda è: quali sono le caratteristiche comuni e le differenze tra Set, FrozenSet, MutableSet e AbstractSet?

La mia seconda domanda è: perché se provo

from collections import FrozenSet 

ottengo

ImportError: cannot import name 'FrozenSet' 

?

Sto usando Python 3.4 e ho installato mypy-lang tramite pip.

risposta

3

Fate attenzione con le annotazioni e digitando Le idee discusse in 484 sono nuove di zecca e implementate nel modulo typing.Tale modulo è disponibile solo in Python3.5 (l'ultimo typing è disponibile anche da pip per Py2 e Py3).

https://docs.python.org/3/library/typing.html

quella nota che è stato citato da una sezione in 484 che inizia:

Per aprire l'uso di tipo statico controllo per Python 3.5 e versioni precedenti, uno spazio dei nomi divisa è necessario. A tal fine, viene introdotto un nuovo modulo nella libreria standard chiamato digitando.

Le cose che gli elenchi di note sono tipi di annotazione, non classi di oggetto reali (incorporate o da collections). Non confondere i due.

noti che Dict, List, Set e FrozenSet sono tutti in maiuscolo, dove come le funzioni (ei nomi) sono di tipo dict, list, set, frozenset. In altre parole, per creare un dizionario si utilizza dict() o {}, non Dict.

Le annotazioni sono nuove a 3.0 (non in 2.n). In un normale interprete tutto ciò che fanno è popolare nel dizionario __annotations__ della funzione. Non c'è niente nell'interprete che usi o richieda annotazioni.

http://mypy-lang.org/ si descrive come un controllore di dattilografia sperimentale. È necessario consultare la documentazione per vedere quanto sia compatibile con 484 ecc.

https://docs.python.org/3/library/collections.abc.html#module-collections.abc ha alcune definizioni astratte, che credo utilizzino typing. Non li ho mai usati. Sono principalmente per persone che sviluppano nuove classi di oggetti, non utenti "regolari".

Il tag typing per questa domanda non è probabilmente una buona idea. Non ha molti seguaci ed è troppo generico. Non si riferisce a questo modulo Python.

Ricerca per [python] 484 per altre domande SO relative a questo stile di annotazioni.

https://github.com/python/typing - il repository di sviluppo typing.

In questo repository, esiste una definizione FrozenSet nel file python2/typing.py (il backport python2), ma non in src/typing.py. Non sono sicuro del significato di ciò.

+0

Ciao, grazie per la tua risposta. Ora ho idee più chiare (sapevo della differenza tra tipi di annotazioni e oggetti, ma non sapevo sui moduli di digitazione di typy vs python3.5 di mypy). Tuttavia, ho esaminato entrambe le documentazioni e non sono riuscito a trovare un riferimento a FrozenSet, menzionato in PEP 484. Mi manca qualcosa? – marcotama

+0

Sembra che non abbiano aggiunto 'FrozenSet' a' typing'. Molte delle classi in 'typing' eseguono il mapping su' collections.abc', che ha cose come 'MutableSet' e' AbstractSet', ma non 'FrozenSet'. Quindi a questo punto 'FrozenSet' è solo un'idea nel PEP, niente di più. – hpaulj

+0

C'è un repository github per il modulo 'typing'. Esploralo per vedere cosa potrebbe essere aggiunto in futuro. – hpaulj

-1

Ognuno di questi viene utilizzato per cose diverse.

set sono molto simile al concetto matematico di insiemi: https://en.wikipedia.org/wiki/Set_(mathematics)

Un set in Python è essenzialmente una collezione di oggetti unici. Puoi leggere ulteriori informazioni sui set, nonché vedere alcuni esempi, qui: http://www.python-course.eu/python3_sets_frozensets.php

I set in Python sono una raccolta di oggetti unici (tutti immutabili) ma un FrozenSet è immutabile. Questo significa che puoi cambiare un Set, ma non puoi cambiare un FrozenSet: devi creare un nuovo FrozenSet.

In python3, frozenset è un argomento di default chiamato 'frozenset'

+0

Ciao, come ho risposto a lciamp, conosco la differenza tra set e frozenset. La mia domanda era specifica per il modulo di battitura, quindi le lettere maiuscole. Mi dispiace se non sono stato chiaro. – marcotama

0

Il tipo di set è mutabile - i contenuti possono essere modificati utilizzando metodi come add() e rimuovere(). Poiché è mutabile, non ha un valore hash e non può essere utilizzato come chiave del dizionario o come elemento di un altro set. Il tipo frozenset è immutabile e lavabile: il suo contenuto non può essere modificato dopo la creazione; tuttavia, può essere utilizzato come chiave del dizionario o come elemento di un altro set.

da: https://docs.python.org/3/library/stdtypes.html#frozenset

non è necessario includerlo, è costruito in, basta fare:

cities = frozenset(["Frankfurt", "Basel","Freiburg"])

testate in 3.4.2

+0

Grazie, conosco queste differenze. La domanda riguardava il modo in cui questi tipi sono mappati nel modulo di battitura. Mi dispiace se non sono stato chiaro. – marcotama

Problemi correlati