2012-01-13 14 views
43

Widziałem następujący kod w Pythonie biblioteki standardowej /usr/lib/python2.7/multiprocessing/dummy/__init__.py:Jaki jest efekt "list = list" w modułach Pythona?

list = list 
dict = dict 

Co to idiom oznacza? Domyślam się: "sprawdźmy, czy istnieje dict i list". Czy to tylko starsza wersja kodu z czasów starożytnych bez list i dict w __builtins__?

Mam jeszcze jedną szaloną hipotezę: optymalizacja prędkości wyszukiwania w ruchu list z zakresu globalnego do zakresu modułów. Czy to rozsądne założenie dotyczące idiomu? Rozumiem, że założenie jest błędne, jeśli zastosuję je do wieloprocesowości.

+1

(+1) za interesujące pytanie. Biorąc pod uwagę, że w Pythonie 2.6 wprowadzono "wieloprocesorowość", nie wydaje się zbyt prawdopodobne, że kod jest bardzo stary. – NPE

+0

Dzięki za komentarz! Myślałem, że "wieloprocesorowość" jest wystarczająco duża, aby używać go w Pythonie 2.4, ponieważ nie ma notatki "Od wersji 2.6" w dokumentach [1] :( [1] http://docs.python.org/dev/library/multiprocessing .html – darkk

+1

Nie sądzę, że to naprawdę ma znaczenie, ale istnieje notatka "Nowy w wersji 2.6." w całym module: http://docs.python.org/library/multiprocessing.html – NPE

Odpowiedz

30

Eksport. Następnie można wykonać:

from multiprocessing.dummy import list 

... która jest normalna list.

Bez tej linii nie byłoby list w pakiecie multiprocessing.dummy.

Rozsądnie jest mieć jednolite API dla różnych pakietów. Powiedzmy, że wszystkie pakiety mają oferować klasę list. Pakiet a zdecyduje się dostarczyć niestandardową implementację, pakiet b chce jednak użyć list z __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() 

Istnieje więcej powodów, aby robić takie rzeczy. Na przykład, aby jasno określić, z czego korzystasz.

list = list 

może być również postrzegana jako instrukcja "jeśli chcesz zmienić typ list, których używam, zmień go tutaj."

W tym konkretnym przypadku jest to pierwsze. list i dict narażone są jako:

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

a definicja Manager jest:

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

tj Manager.list = list.

+4

Czy to jest dla forów kompatybilność lub dlaczego ktokolwiek musiałby importować wbudowane z innego miejsca niż '__builtin__'? Czy jest to coś konkretnego związanego ze sposobem działania modułu' multiprocessing.dummy'? – Kimvais

+0

To nie jest ograniczone do wbudowanych .. –

+2

I drugie pytanie Kimvais. 'multiprocessing' nie eksportuje' dict' i 'list', więc nie widzę powodu, by to robić. – darkk