Note di Portabilità - Riepilogo Modifiche ai Moduli

abc

I decoratori abstractproperty(), abstractclassmethod e abstractstaticmethod sono deprecati. La combinazione di abstractmethod() con i decoratori property(), classmethod() e staticmethod() funziona come atteso (Python issue 11610).

anydbm

Il modulo è stato rinominato in dbm in Python 3.

argparse

L'argomento di versione per ArgumentParser è stato rimosso in favore di un tipo speciale action (Ptyhon issue 13248).

La vecchia forma passava version come argomento.

parser = argparse.ArgumentParser(version='1.0')

La nuova forma richiede l'aggiunta di una definizione specifica di argomento.

parser = argparse.ArgumentParser(version='1.0')
parser.add_argument('--versione', action='version',
                    version='%(prog)s 1.0')

Il nome dell'opzione e la stringa del formato di versione possono essere modificate per adattarsi alle esigenze dell'applicazione.

In Python 3.4, l'azione di versione è stata cambiata per stampare la stringa di versione a stdout invece che stderr (Python issue 8990). .

array

Il tipo 'c' utilizzato per i byte carattere nelle prime versioni di Python 2 è stato rimosso. Utilizzare 'b' o 'B' per byte.

Il tipo 'u per i caratteri da stringhe unicode è stato deprecato e sarà rimosso in Python 4.0.

I metodi tostring() e fromstring() sono stati rinominati tobytes() e frombytes() per eliminare una ambiguità (Python issue 8990).

atexit

Quando atexit venne aggiornato per includere l'implementazione in C (Python issue 1680961) fu introdotta una regressione nella logica di gestione dell'errore che faceva sì che venisse mostrato solo il riepilogo della eccezione, senza il traceback. Questa regressione è stata corretta in Python 3.3 (Python issue 18776).

base64

encodestring() e decodestring() sono stati rispettivamente rinominati encodebytes() e decodebytes(). I vecchi nomi funzionano ancora come alias ma sono deprecati Python issue 3613.

Due nuove codifiche che utilizzano alfabeti da 85 caratteri. b85encode() implementa una codifica utilizzata in Mercurial e git, mentre a85encode() implementa il formato Ascii85 utilizzato nei file PDF (Python issue 17618).

bz2

Le istanze di BZ2File ora supportano il protocollo di gestore di contesto, e non serve incapsularle in contextlib.closing().

collections

Le classi base astratte precedentemente definite in collections sono state spostate in collections.abc, con compatibilità all'indietro tramite import in collections, per ora (Python issue 11085) .

commands

Le funzioni getoutput() e getstatusoutput() sono state spostate in subprocess e commands è stato eliminato .

configparser

Il vecchio modulo ConfigParser è stato rinominato configparser.

La vecchia classe ConfigParser è stata rimossa a favore di SafeConfigParser che a sua volta è stata rinominata in ConfigParser. Il comportamento deprecato di interpolazione è disponibile tramite LegacyInterpolation.

Il metodo read() ora supporta un argomento encoding, in modo che non sia più necessario utilizzare codecs per leggere file di configurazione che hanno dei valori Unicode.

L'utilizzo del vecchio RawConfigParser è sconsigliato. I nuovi progetti dovrebbero utilizzare ConfigParser(interpolation=None) per ottenere lo stesso comportamento. .

contextlib

E' stato rimosso contextlib.nested(). Passare gestori di contesti multipli alla stessa istruzione with.

csv

Invece di utilizzare il metodo next() di un reader direttamente, utilizzare la funzione built-in per chiamare propriamente l'iteratore. .

datetime

A partire da Python 3.3, i confronti di uguaglianza tra istanze di datetime consapevoli o meno del fuso orario ritornano False invece che sollevare una eccezione TypeError (Python issue 15006).

Prima di Python 3.5 un oggetto datetime.time che rappresenta la mezzanotte ritornava False quando convertito in Booleano. Questo comportamento è stato rimosso in Python 3.5 (Python issue 13936). .

decimal

Python 3.3 incorpora una implementazione C di decimal basata su libmpdec. Questa modifica migliora le prestazioni, inoltre include alcune modifiche alle API e differenze di comportamento rispetto all'implementazione in puro Python. Si vedano le note di rilascio di Python 3.3 per ulteriori dettagli.

fractions

I metodi di classe from_float() e from_decimal() non sono più necessari. I valori a virgola mobile e Decimal possono essere passati direttamente al costrutture Fraction.

gc

I flag DEBUG_OBJECT e DEBUG_INSTANCE sono stati rimossi. Non sono più necessari per differenziare tra classi nuove e "vecchio stile"-.

gettext

Tutte le funzioni di traduzione in gettext assumono che input e output sia unicode, e le varianti unicode tipo ugettext() sono state rimosse.

glob

La nuova funzione escape() implementa una soluzione per cercare file con meta-caratteri nel nome (Python issue 9124).

http.cookies

Oltre a inserire nelle sequenze di escape gli apici, SimpleCookie codifica anche virgole e punti e virgola in valori per riflettere maggiormente il comportamento dei veri browser (Python issue 9824).

imaplib

In Python3 imaplib ritorna stringhe di byte codificate come UTF-8. C'è supporto per accettare stringhe unicode e codificarle automaticamente mentre vengono spediti come comandi in uscita oppure come utente/password per autenticazione su di un server. .

inspect

Le funzioni getargspec(), getfullargspec(), getargvalues(), getcallargs(), getargvalues(), formatargspec(), e formatargvalues() sono state deprecate a beneficio di signature() (Python issue 20438).

itertools

Le funzioni imap, izip() ed ifilter() sono state sostituite con versioni di funzioni built-in che ritornano degli iterabili in luogo di oggetti list (map(), zip()) e filter:() rispettivamente).

json

L'api di json è stata aggiornata per supportare solamente str e non bytes visto che la specifica di JSON è definita usando Unicode.

locale

La versione normalizzata del nome della codificat UTF-8 è cambiata da "UTF8" a "UTF-8" visto che i sistemi operativi MAC OS X ed OpenBSD non supportano l'uso di "UTF8" (Python issue 1054 e Python issue 10090).

logging

Il modulo logging ora include il logger lastResort utilizzato se non viene eseguita alcuna configurazione di logging da una applicazione. Ciò elimina la necessità di configurare il logging di una applicazione solo per evitare che l'utente veda messaggi di errore nel caso che una libreria importata da una applicazione usi logging ma l'applicazione stesso no.

mailbox

mailbox legge e scrive i file mailbox in modalità binaria, affidandosi al pacchetto email per l'elaborazione dei messaggi. Input StringIO e file di testo sono deprecati (Python issue 9124).

nmap

I valori ritornati dall'API di lettura sono stringhe di byte, e devono essere decodificate prima di trattarle come testo.

operator

La funzione div()è stata rimossa. Si utilizzi floordiv() oppure truediv(), a seconda della semantica desiderata.

La funzione repeat() è stata rimossa. Si utilizzi al suo posto mul().

Le funzioni getslice(), setslice(), e delslice() sono state rimosse. Si utilizzi getitem(), setitem(), e delitem() con porzioni di indici.

La funzione isCallable() è stata rimossa. Si utilizzi la classe base astratta collections.Callable.

isinstance(obj, collections.Callable)

Le funzioni di verifica di tipo isMappingType(), isSequenceType(), e isNumberType() sono state rimosse. Si utilizzi le relative classi base astratte da collections o numbers.

isinstance(obj, collections.Mapping)
isinstance(obj, collections.Sequence)
isinstance(obj, numbers.Number)

La funzione sequenceIncludes() è stata rimossa. Si utilizzi contains().

os

Le funzioni popen2(), popen3() e popen4() sono state rimmosse. popen() è ancora presente ma è deprecato ed emette avvertimenti se utilizzato. Il codice che utilizza queste funzioni dovrebbe essere riscritto usando subprocess per aumentarne la portabilità tra i sistemi operativi.

Le funzioni os.tmpnam(), os.tempnam(), e os.tmpfile() sono state rimesse. Si usi il modulo tempfile in sostituzione.

La funzione os.stat_float_times() è deprecata Python issue 14711.

La funzione os.unsetenv() non ignora più gli errori Python issue 13415.

os.path

os.path.walk() è stata rimossa. Si usi os.walk().

pdb

L'alias di comando print è stata rimossa. Si utilizzi al suo posto do chprint() (Python issue 18764). La scorciatoia p è contenuta.

platform

platform.popen() è stata deprecata. Si usi subprocess.popen() al suo posto (Python issue 11377).

platform.uname() ora restituisce una namedtuple.

Visto che le distribuzioni Linux non hanno un modo consistente per descrivere se stesse, le funzioni per ottenere descrizioni (platform.dist() e platform.linux_distribution) sono deprecate e in calendario per la rimozione in Python 3.7 (Python issue 1322.

pickle

L'implementazione C del modulo pickle da Python 2 è stata spostata verso un nuovo modulo che è usato automaticamente per sostituire quando possibile l'implementazione Python. Il vecchio idioma di importazione:

può essere sostituito con:

import pickle

L'interoperabilità tra Python 2.x e Python 3.x è stata migliorata per i dati lavorati da pickle usando il livello di protocollo 2 o inferiore per risolvere un problema introdotto quando un grande numero di moduli di librerie standard erano rinominati durante la transizione verso Python 3. Visto che i dati lavorati con pickle includono riferimenti a classi e tipi di nomi, ed questi nomi erano cambiati, risultava difficile lo scambio di dati lavorati con pickle tra programmi Python 2 e Python 3. Ora per i dati lavorati con pickle con il protocollo 2 o più vecchio, i vecchi nomi delle classi sono automaticamente utilizzati durante le operazioni di lettura e scrittura da un flusso di pickle.

Questo comportamento è disponibile nella modalità predefinita, e può essere disabilitato con l'opzione fix_imports. Questa modifica migliora la situazione, ma non elimina interamente le incompatibilità. IN particolare, è possibile che dati lavorati con pickle sotto Python 3.1 con possano essere letti sotto Python 3.0. Per assicurare la massima portabilità tra applicazioni Python 3, si usi il livello di protocollo 3, che non contempla questa caratteristica di compatibilità.

La versione del protocollo predefinito è stata cambiata da 0, la versione leggibile dall'umano, a 3, il formato binario con la migliore interoperabilità se condivisa tra applicazioni Python 3.

I dati in formato di stringa di byte scritti con pickle da una applicazione Python 2.x vengono decodificati quando vengono riletti per creare un oggetto stringa Unicode. La codifica predefinita per la trasformazione è ASCII, e può essere modificata passando valori a Unpickler.

pipes

pipes.quote() è stato spostao in shlex ().

random

La funzione jumpahead() è stata rimossa in Python 3.0.

re

Il flag UNICODE costituisce il comportamento predefinito. Per ripristinare il comportamento ASCII, specifico di Python 2, utilizzare il flag ASCII.

shelve

Il formato di output predefinito per shelve può creare un file con una estensione .db aggiunta al nome dato a shelve.open().

signal

PEP 475 indica che le chiamate di sistema interrotte che ritornano con EINTR siano ritentate. Questo modifica il comportamento dei gestori di segnali e altre chiamate di sistema, visto che dopo che il gestore di segnali ritorna, la chiamata interrotta verrà ritentata, a meno che il gestore di segnali sollevi una eccezione. Fare riferimento alla documentazione PEP per i dettagli completi.

socket

In Python 2 tipicamente gli oggetti stringa potevano essere inviati direttamente attraverso un socket. Visto che str sostituisce unicode, in Python 3 i valori devono essere codificati prima di essere inviati. Gli esempi in socket usano stringhe di byte, che sono già codificate.

socketserver

Il modulo socketserver si chiamava SocketServer in Python 2.

string

Tutte le funzioni del modulo string che sono anche metodi di oggetti str sono state rimosse.

Le costanti letters, lowercase e uppercase sono state rimosse. Le nuove costanti con nomi simili sono limitate all'insieme dei caratteri ASCII.

La funzione maketrans() è stata sostituita dai metodi str.bytes e str.bytearray per chiarire quale tipo di input sia supportato da ciascuna tabella di traduzione.

struct

struct.pack() ora supporta solamente stringhe di byte quando si utilizza il codice di impacchettamento s, e non vengono più codificati implicitamente gli oggetti stringa verso UTF-8 (Python issue 10783).

subprocess

Il valore predefinito per l'argomento close_fds per subprocess.Popen è stato modificato in modo che sia sempre False. Viene sempre predefinito a True sotto UNIX, mentre sotto Windows se gli argomenti del flusso I/O standard sono impostati a None, altrimenti viene predefinito a False.

sys

La variabile sys.exitfunc non viene più controllata per una azione di pulizia da eseguirsi quando il programma esce. Utilizzare atexit.

La variabile sys.subversion non è più definita.

I flag sys.flags.py3k_warning, sys.flags.division_warning, sys.flags.division_new, sys.flags.tabcheck, e sys.flags.unicode non sono più definiti.

La variabile sys.maxint non è più definita, utilizzare sys.maxsize. Si veda PEP 237 (unificare interi e interi long).

Le variabili che tracciano eccezioni globali sys.exc_type, sys.exc_value e sys.exc_traceback sono state rimosse. E' stata rimossa anche la funzione sys.exc_clear().

La variabile sys.version_info è ora una istanza namedtuple con attributi major, minor, micro, releaselevel e serial (Python issue 4285).

La caratteristica "check interval", che controlla il numero di opcodes da eseguire prima di consentire un passaggio di contesto di thread è stata rimpiazzata con un valore temporale assoluto, gestito da sys.setswitchinterval(). Le vecchie funzioni per gestire l'intervallo di verifica, sys.getcheckinterval() e sys.setcheckinterval() sono deprecate.

Le variabili sys.meta_path e sys.path_hooks ora espongono tutti i rilevatori di percorso e voci di hook per importare moduli nelle versioni precedenti, erano esposti solo i rilevatori ed hooks esplicitamente aggiunti al percorso, e l'import C utilizzava valori nella sua implememntazione che non potevano essere modificati dall'esterno.

Per sistemi Linux, sys.platform non comprende più il numero di versione. Il valore è ora semplicemente linux e non linux2 o linux3.

threading

Il modulo thread è deprecato in favore dell'API in threading.

Le caratteristiche di debug di threading, compreso l'argomento verbose sono state rimosse dalle API (Python issue 13550).

Vecchie implementazioni di threading utilizzavano funzioni di factory per alcune delle classi poichè erano implementate in C come estensione dei tipi e non potevano essere subclassate. Questa limitazione del linguaggio è stata rimossa, e molte delle vecchie funzioni factory sono state convertite a classi standard, le quali consentono la sottotipizzazione (subclassing) - Python issue 10968.

time

time.asctime() e time.ctime() sono state reimplementate e ora non usano le funzioni di sistema di time per supportare l'utilizzo di un maggiore numero di anni. time.ctime() ora supporta gli anni da 1900 fino a maxint, sebbene per valori più alti di 9999 la stringa in uscita sia più lunga dei 24 caratteri standard per accomodare le cifre di anno supplementari (Python issue 8013).

unittest

I metodi di TestCase che iniziano con "fail" (failIf(), failUnless(), ecc.) sono stati deprecati. Si usi la forma alternativa dei metodi di asserzione.

Parecchi alias di vecchi metodi sono stati deprecati e sostituiti con nomi preferiti. L'uso dei nomi deprecati produce un avvertimento (Python issue 9424).

Nomi Deprecati Nomi Preferiti
assert_() assertTrue()
assertEquals() assertEqual()
assertNotEquals() assertNotEqual()
assertAlmostEquals() assertAlmostEqual()
assertNotAlmostEquals() assertNotAlmostEqual()

UserDict, UserList, UserString

Le classi UserDict, UserList, UserString sono state spostate dai loro propri moduli nel modulo collections. dict, list e str possono essere direttamente subclassate ma le classi in collections possono rendere l'implementazione della sottoclasse più semplice visto che il contenuto del contenitore è disponibile direttamente attraverso un attributo di istanza. Anche le classi astratte in collections.abc sono utili per creare contenitori personalizzati pche seguono le API dei tipi built-in. .

uuid

uuid.getname() ora utilizza la variabile di ambiente PATH per trovare programmi che possono rilevare l'indirizzo MAC dell'host sotto UNIX (Python issue 19855). Se non viene trovato un programma nei percorsi indicati in PATH tenta la ricerca in /sbin e /usr/sbin. Il comportamento di ricerca può dare risultati differenti rispetto a versioni precedenti di Python se versioni alternative di programmi tipo netstat, ifconfig, ip ed arp sono presenti e produrre risultati differenti.

whichdb

Le funzionalità di wichdb sono state spostate nel modulo anydbm.

xml.etree.ElementTree

XMLTreeBuilder è stato rinominato in TreeBuilder, l 'API è stata sottoposta a diversi cambiamenti.

ElementTree.getchildren() è stato deprecato. Usare list(elem) per costruire una lista di figli. ElementTree.getiterator() è stato deprecato. Usare iter() per creare un iteratore usando il protocollo del normale iteratore. Quando fallisce l'elaborazione, invece che sollevare xml.parsers.expat.ExpatError, XMLParser ora solleva xml.etree.ElementTree.ParseError.

zipimport

I dati restituiti da get_data() sono in formato di stringa di byte, e devono essere codificati prima di utilizzarli come stringa unicode.