2013-10-15 3 views
4

Питон встроенного типа set имеет метод pop(), из документации:Python: Какой прецедент для set.pop()?

Снять и вернуть произвольный элемент из множества. Повышает KeyError , если набор пуст.

Я не мог придумать какой-либо прецедент для этой функции, похоже, это попытка реализовать интерфейс list.

Почему эта часть стандарта Python?

+3

Это зеркало ['dict.pop()'] (http://docs.python.org/2/library/stdtypes.html#dict.pop) и ['dict.popitem()'] (http://docs.python.org/2/library/stdtypes.html#dict.popitem). Он используется в ситуациях, когда вам нужно «следующее» значение для обработки, но порядок не требуется. –

ответ

7

Вы использовали бы его, когда у вас есть пул рабочих мест для обработки в определенном порядке. Работа должна быть выполнена только один раз, но когда выполняются может быть добавлен еще раз:

jobs = set([job1, job2, job3]) 

while jobs: 
    job = jobs.pop() 
    job.process() 

где job.process() потенциально добавляет больше рабочих мест в кучу. После того как все задания будут обработаны, набор будет пустым и цикл будет выполнен.

Или, менее надуманный, в реальном мире, например, увидеть DependencyFinder.find() method из distlib библиотеки (используется pip, например), который использует todo набор для отслеживания поставщиков распределения, которые все еще нуждаются в обработке.

Метод является зеркалом dict.popitem() method, который явно упоминает набор алгоритмов:

popitem() полезно с разрушением итерации по словарю, как это часто используется в наборе алгоритмов.

Перед set был добавлен к языку, вы бы использовать словарь с None значений для эмуляции набора.

+0

Это похоже на очень надуманный пример. В большинстве случаев маловероятно, чтобы не было предпочтительного порядка. Кроме того, маловероятно, что вы хотите только отделить задание в очереди. Более реалистичный сценарий, вероятно, будет иметь очередь ожидающих заданий и набор выполненных заданий, чтобы одно задание никогда не выполнялось дважды. – Erik

+0

@branks: это не так надуманно, как вы думаете. Библиотека ['distlib'] (https://bitbucket.org/pypa/distlib/src/af1107909f4dffd7f474773e1f3aca3616ff9ba1/distlib/locators.py?at=default#cl-1134) использует наборы точно так же, как это, например. –

Смежные вопросы