2012-01-13 9 views
43

Ho visto seguente codice nella libreria standard di Python /usr/lib/python2.7/multiprocessing/dummy/__init__.py:Qual è l'effetto di "lista = lista" nei moduli Python?

list = list 
dict = dict 

Che cosa significa questo idioma? La mia ipotesi migliore è: "controlliamo se esistono dict e list". È solo il codice legacy dei tempi antichi senza list e dict nello __builtins__?

E ho un altro indovinare mad: ottimizzazione della velocità di ricerca in movimento list dalla portata globale al modulo ambito. È ragionevole pensare all'idioma? Vedo, che l'ipotesi è sbagliata se la applico al multiprocessing.

+1

(+1) per la domanda interessante. Dato che il 'multiprocessing' è stato introdotto in Python 2.6, non sembra molto probabile che il codice sia molto vecchio. – NPE

+0

Grazie per il commento! Ho pensato che 'multiprocessing' fosse abbastanza vecchio per usarlo in Python 2.4 dato che non ci sono note" Since 2.6 "in docs [1] :( [1] http://docs.python.org/dev/library/multiprocessing .html – darkk

+1

Non penso che importi davvero qui, ma c'è una nota "New in version 2.6." sull'intero modulo: http://docs.python.org/library/multiprocessing.html – NPE

risposta

30

Esportazioni. È quindi possibile fare:

from multiprocessing.dummy import list 

... che sembra essere il normale list.

Senza questa riga, non ci sarebbe list nel pacchetto multiprocessing.dummy.

È ragionevole disporre di un'API uniforme tra i pacchetti. Supponiamo che tutti i pacchetti offrano una classe list. Il pacchetto a sceglie di fornire un'implementazione personalizzata, tuttavia il pacchetto b desidera utilizzare list da __builtins__.

powerful/__init__.py: 
from powerfulinternals import PowerfulList as list 
from simple.simpleinternals import Something as whoo 

simple/__init__.py: 
list = list 
from simpleinternals import Something as whoo 

application.py: 
try: 
    import powerful as api 
else: 
    import simple as api 

mylist = api.list() 
woot = api.whoo() 

C'è motivo in più per fare queste cose. Ad esempio per rendere esplicito ciò che stai usando.

list = list 

può anche essere visto come una dichiarazione "se si desidera modificare il tipo di liste che sto usando, cambiare qui."

In questo caso particolare, è il primo. Il list e dict sono esposti come:

manager = multiprocessing.dummy.Manager() 
l = manager.list() 
d = manager.dict() 

E la definizione di Manager è:

def Manager(): 
    return sys.modules[__name__] 

cioè Manager.list = list.

+4

È per avanti compatibilità o perché qualcuno dovrebbe importare un builtin da qualche altra parte rispetto a '__builtin__'? O è qualcosa di specifico da fare con il funzionamento del modulo' multiprocessing.dummy'? – Kimvais

+0

Non è limitato ai builtin. –

+2

I secondo interrogativo su Kimvais. 'multiprocessing' non esporta' dict' e 'list', quindi non vedo buone ragioni per farlo – darkk