2013-08-31 1 views
2

У меня есть библиотека, которая используется проектом, который я построил. Один из классов в библиотеке использует itertools для генерации инкрементирующего id (в настоящее время начиная с 1) каждый раз, когда он создается. Я хотел бы иметь возможность инициализировать, где инкремент начинается в библиотеке на основе идентификаторов, которые известны в основном цикле сервера, который использует библиотеку. Это происходит, когда я начинаю и останавливаю демона, иды могут подниматься с того места, где они остановились. Демон может определить правильную отправную точку, используя SQL-запрос к бэкэнду db, но я не могу понять, как передать его в библиотеку, которая будет использоваться в качестве отправной точки.initialize itertools count в библиотеке из запроса базы данных

Из библиотеки, в настоящее время:

class Thing(object): 
    id_iter = itertools.count(1) 
    def __init__(self): 
     self.id = self.id_iter.next() 

Я хотел бы заменить 1 с переменной, которая может быть передана в класс на своем первом конкретизации. Любая идея как? Другой подход?

+0

Вы имеете в виду, что в первый раз, когда экземпляр класса создан, идентификатор установлен? – Bakuriu

+0

каждый раз, когда сервер запускается, он определяет эту начальную точку из db, и мне нужно передать это значение для инициализации начальной точки итератора класса (который находится в библиотеке) – domoarrigato

ответ

0
class Thing(object): 
    id_iter = None 
    def __init__(self, num=1): 
     if Thing.id_iter is None: 
      Thing.id_iter = itertools.count(num) 
     self.id = next(self.id_iter) 

Пример:

x = Thing(5) 
print(x.id)  #prints 5 
y = Thing() 
print(y.id)  #prints 6 
+0

это все еще не дает мне способ передать начальную точку с сервера, который использует библиотеку. Без этого итератор только начинает отступать в 1, когда сервер перезагружается. получение начальной точки в библиотеке является основной проблемой. – domoarrigato

+0

@domoarrigato - немного смущенный, поэтому я включил 'num = 1' в конструктор' __init__', когда сервер перезагружен, вы можете просто передать начальную точку из db в конструктор. См. Мой ответ для примера. – gnr

+0

ОК, получил его работу. проблема заключалась в том, что Thing не создается непосредственно в демонах, а скорее другими классами в библиотеке, поэтому мне нужно было инициализировать его, создав его сразу один раз, когда загружается сервер. здорово! – domoarrigato

0

Вы можете использовать itertools.islice, чтобы начать (и остановки) итерация при произвольных индексов.

>>> cycler = itertools.cycle(range(20)) 
>>> itertools.islice(cycler, 10, None).next() 
10 
>>> cycler.next() 
11 

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

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

  • Нет связанных вопросов^_^