<p>很遗憾,每次都需要指定默认的工厂。也许可以试试这样的</p>
<pre><code>class ConsecutiveIds(defaultdict):
def __init__(self):
super(ConsecutiveIds, self)
self.default_factory = lambda: len(self)
d = ConsecutiveIds()
</code></pre>
<p>似乎确实有一个异常删除,这将重复旧的值</p>
<pre><code>In [4]: d = ConsecutiveIds()
In [5]: d[0]
Out[5]: 0
In [6]: d[10]
Out[6]: 1
In [7]: d[20]
Out[7]: 2
In [8]: d
Out[8]:
ConsecutiveIds(<function __main__.ConsecutiveIds.__init__.<locals>.<lambda>()>,
{0: 0, 10: 1, 20: 2})
In [9]: del d[10]
In [10]: d[30]
Out[10]: 2
In [11]: d
Out[11]:
ConsecutiveIds(<function __main__.ConsecutiveIds.__init__.<locals>.<lambda>()>,
{0: 0, 20: 2, 30: 2})
</code></pre>
<p>这种异常似乎并不存在于<a href="https://stackoverflow.com/a/56812873/633094">ikamen's answer</a>,但更简洁地说,你可以说:</p>
<pre><code>class ConsecutiveIds(defaultdict):
def __init__(self):
super(ConsecutiveIds, self)
self.default_factory = self.next_int
self.index = 0
def next_int(self):
result = self.index
self.index += 1
return result
</code></pre>
<p>这可以进一步细化为</p>
<pre><code>class ConsecutiveIds(defaultdict):
def __init__(self):
super(ConsecutiveIds, self)
counter = itertools.count()
self.default_factory = lambda: next(counter)
</code></pre>