Сопрограмма Python, которая потребляет и производит - PullRequest
1 голос
/ 16 декабря 2011

В моем веб-сканере у меня есть класс, который отслеживает URL для сканирования, удаления дубликатов и т. Д.

clerk = VisitOnlyOnceClerk()
clerk.enqueue(starting_point, starting_point)
for (url, referer) in clerk:
    # get the url, and clerk.enqueue() all the links from it ...

Это похоже на задачу, которую может выполнить сопрограмма.Я видел примеры сопрограмм, которые только производят значения, и примеры, которые исключительно потребляют значения, но ни один, который делает оба.Что-то вроде:

def visit_once_clerk():
    visited = set()
    to_visit = set([(yield)])

    for i in to_visit:
        visited.add(i[1])
        extras = (yield i)
        if extras:
            to_visit.union(i for i in extras if i[1] not in visited)

Это, конечно, не работает так, как мне кажется.Являются ли сопрограммы даже правильным инструментом здесь?Как правильно их использовать в этом случае?

1 Ответ

0 голосов
/ 16 декабря 2011

Я не думаю, что сопрограммы - это путь к вашему генератору классов. ИМХО гораздо удобнее и понятнее, чем способ, которым Python сопрограмма позволит вам сделать.

Чтобы сделать мойДело в том, как я буду реализовывать сопрограмму:

def visit_once_clerk(start_point=None):
    visited = set()
    to_visit = set(start_point or [])

    while to_visit:
        value = (yield to_visit.pop())
        if value and value not in visited:
            to_visit.add(value)

А вот как это следует использовать:

clerk = visit_once_clerk(['start'])
print clerk.next()   # Print: start
print clerk.send('test')  # Print: test
print clerk.next()   # Raise StopIteration

Примечание: вы видите, что есть разница между двумяВ частности, при реализации действий send и enqueue действие send немедленно выдаст значение, отправленное ITOH enqueue запланирует получение нового значения произвольно (из-за использования set)

...