[Python] Sets deprecated

Daniele Varrazzo piro a develer.com
Lun 18 Ott 2010 16:26:42 CEST


On Mon, 18 Oct 2010 15:48:20 +0200, "Vittorio Zuccala'"
<vittorio.zuccala a gmail.com> wrote:
> Buongiorno a tutti,
> sto cercando di convertire un file.py in file.exe con py2exe.
> Ho la versione 2.6 di python ed installato py2exe per tale versione...
> Quando lancio, seguendo il tutorial, il comando "python setup.py
py2exe",
> l'interprete mi crea l'eseguibile correttamente.
> Al contrario, se provo a fare un import di py2exe dalla "Python Shell
Gui"
> questa mi risponde:
> 
> "Warning (from warnings module):
>   File "C:\Python26\lib\site-packages\py2exe\build_exe.py", line 16
>     import sets
> DeprecationWarning: the sets module is deprecated"
> 
> Quale puņ essere il motivo?
> E soprattutto come mai mi crea l'eseguibile se la libreria "sets" č
> deprecated?

Gli insiemi furono introdotti in una vecchia versione di Python, forse
2.3, in un modulo separato sets (implementato in Python puro). Visto che
sono molto utili sono stati reimplementati in maniera piu' efficiente in C
ed inclusi nella standard lib.

Nelle precedenti versioni occorreva importare Set/ImmutableSet dal modulo
sets. Ora ci sono gli oggetti set e frozenset che hanno la stessa
interfaccia ma sono disponibili direttamente negli oggetti builtin. Per
questo motivo gli oggetti in sets sono un'inutile duplicazione, e l'idea
e'quella di sbarazzarsene.

Per non rompere la compatibilita' dei programmi da un giorno all'altro, i
cambi incompatibili col passato come l'eliminazione di sets non avvengono
da una release all'altra. Es. set e frozenset furono introdotti in 2.4. In
2.5 hanno convissuto in pace. nel 2.6 sets e' stato deprecato ed emette un
warning quando viene usato: i programmi hanno quindi molto tempo di
cambiare ad es. la riga

  from sets import Set

in qualcosa tipo

  Set = set

e non modificare ulteriori righe di codice (se non e' un problema si
potrebbe invece droppare l'import e modificare le occorrenze di "Set" con
"set")

In teoria sets sarebbe potuto essere rimosso in 2.7, ma non credo sia
stato fatto. Ovviamente non compare in Python 3.0 e probabilmente non ci
sara' una 2.8 di cui discutere. In particolare in effetti e' stato
deprecato nella 2.6 proprio perche' non viene incluso nella 3.0 (la 2.6 e'
una release traghetto 2->3: l'idea e' che, se un programma non emette
warning in 2.6, allora potra' essere convertito automaticamente in sintassi
3.0 da uno strumento tipo 2to3).

Forse in una versione piu' recente di quella che hai tu py2exe evita di
importare sets e usa direttamente set/frozenset. Forse deve fare cosi'
perche' funziona con versioni precedenti alla 2.4 (in questo caso comunque
puo' essere corretto per usare i nuovi oggetti se disponibili). Comunque
"sets" continua a funzionare, e probabilmente viene solo usato per creare
l'eseguibile, non nell'eseguibile stesso, per cui poi all'uso di
quest'ultimo non ci dovrebbe essere nessun warning generato.

-- 
Daniele Varrazzo - Develer S.r.l. 
http://www.develer.com


Maggiori informazioni sulla lista Python