2

私が構築したプロジェクトで使用されるライブラリがあります。ライブラリ内のクラスの 1 つは itertools を使用して、インスタンス化されるたびに増分 ID (現在は 1 から開始) を生成します。ライブラリを使用するサーバー デーモンのメイン ループで認識されている ID に基づいて、ライブラリのインクリメントが開始する場所を初期化できるようにしたいと考えています。これは、デーモンを開始および停止するときに、ID が中断したところから再開できるようにするためです。デーモンは db バックエンドへの SQL クエリを使用して正しい開始点を決定できますが、それをライブラリに渡して開始点として使用する方法がわかりません。

ライブラリから、現在:

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

1 を、最初のインスタンス化でクラスに渡すことができる変数に置き換えたいと思います。方法はありますか?別のアプローチ?

4

2 に答える 2

0

itertools.isliceを使用して、任意のインデックスで反復を開始 (および停止) できます。

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

特定のケースでどのように使用するかは、クラス iterable とインスタンス化の方法によって異なります。

于 2013-08-31T17:06:41.400 に答える
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
于 2013-08-31T15:18:09.670 に答える