2016-11-18 1 views
4

У меня есть функция библиотеки (которую я не могу изменить), которая принимает в качестве ввода итератор, предоставляющий определенный тип объектов. Я реализовал этот вход как генератор, который анализирует текст и дает его части. Я хотел бы иметь возможность учитывать другую информацию, найденную во время разбора текста.Как отправить дополнительные результаты от генератора python к потребительской функции?

Комментариев в следующем примере дает представление о том, что я хотел бы сделать:

the_text = """1:- 
3:- 
2:+ 
4:- 
6:+ 
2:- 
4:- 
5:+ 
6:- 
7:+""" 

def extract_ints(text): 
    for line in text.split("\n"): 
     fields = line.split(":") 
     #<send fields[1] to my_consumer_function> 
     yield fields[0] 

# Cannot modify this one (actually loaded from library) 
def double_ints(num_source): 
    """Only wants numbers.""" 
    for num in num_source: 
     yield 2 * int(num) 

def my_consumer_function(text): 
    for value in double_ints(extract_ints(text)): 
     #<receive sign from extract_ints> 
     #if sign == "-": 
     # value *= -1 
     print(value) 

my_consumer_function(the_text) 

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

+0

вам нужно использовать этот double_ints? не можете ли вы просто позвонить карте, чтобы сделать это? – danielfranca

+0

Это всего лишь пример. Я на самом деле имею дело с некоторой задачей анализа биоинформатики, но я предпочел использовать простой пример. – bli

+0

Можете ли вы сохранить знаки в другом массиве, а затем использовать перечисление, чтобы получить нужный индекс и получить доступ к нему из my_consumer_function? – danielfranca

ответ

2

Интересно, что это лучший способ, но вот один из способов:

from itertools import imap, izip, tee 
from operator import itemgetter 

def extract_ints(text): 
    for line in text.split("\n"): 
     fields = line.split(":") 
     yield fields[0], fields[1] 

def my_consumer_function(text):  
    it1, it2 = tee(extract_ints(text)) 
    it1 = double_ints(imap(itemgetter(0), it1)) 
    it2 = imap(itemgetter(1), it2) 
    for value, sign in izip(it1, it2): 
     if sign == "-": 
      value *= -1 
     print(value) 

Для Python 3 использования регулярных map и zip.

+0

Я подозревал, что что-то можно сделать с помощью 'tee', но я до сих пор не использовал его. Благодарю. – bli

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