Подтвердить что ты не робот

Каков эффект "list = list" в модулях Python?

Я видел следующий код в стандартной библиотеке python /usr/lib/python2.7/multiprocessing/dummy/__init__.py:

list = list
dict = dict

Что означает эта идиома? Мое лучшее предположение: "давайте проверить, существуют ли dict и list". Это просто устаревший код с древних времен без list и dict в __builtins__?

И у меня есть еще одна сумасшедшая догадка: оптимизация скорости поиска перемещается list из глобальной области видимости в модуль. Это разумное предположение относительно идиомы? Я вижу, что предположение неверно, если я применил его к многопроцессорной обработке.

4b9b3361

Ответ 1

Экспорт. Затем вы можете сделать:

from multiprocessing.dummy import list

... который является регулярным list.

Без этой строки в пакете multiprocessing.dummy не будет list.

Это разумно иметь единый API через пакеты. Предположим, что все пакеты должны предлагать класс list. Пакет a решает предоставить пользовательскую реализацию, пакет b однако хочет использовать list от __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()

Там больше причин делать такие вещи. Например, чтобы сделать его явным, что вы используете.

list = list

также можно рассматривать как оператор "если вы хотите изменить тип списков, которые я использую, измените его здесь".

В этом конкретном случае это первый. list и dict отображаются как:

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

И определение Manager:

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

то есть. Manager.list = list.