|
|
@ -8,7 +8,6 @@ import sys |
|
|
|
from collections import OrderedDict |
|
|
|
from contextlib import contextmanager |
|
|
|
from shutil import rmtree |
|
|
|
from tempfile import mkdtemp |
|
|
|
|
|
|
|
from .core import BytesType, Cache, ENOVAL, TextType |
|
|
|
|
|
|
@ -70,10 +69,7 @@ class Deque(Sequence): |
|
|
|
Items are serialized to disk. Deque may be initialized from directory path |
|
|
|
where items are stored. |
|
|
|
|
|
|
|
>>> deque = Deque(directory='/tmp/diskcache/deque') |
|
|
|
>>> deque |
|
|
|
Deque(directory='/tmp/diskcache/deque') |
|
|
|
>>> deque.clear() |
|
|
|
>>> deque = Deque() |
|
|
|
>>> deque += range(5) |
|
|
|
>>> list(deque) |
|
|
|
[0, 1, 2, 3, 4] |
|
|
@ -102,8 +98,6 @@ class Deque(Sequence): |
|
|
|
:param directory: deque directory (default None) |
|
|
|
|
|
|
|
""" |
|
|
|
if directory is None: |
|
|
|
directory = mkdtemp() |
|
|
|
self._cache = Cache(directory, eviction_policy='none') |
|
|
|
with self.transact(): |
|
|
|
self.extend(iterable) |
|
|
@ -113,9 +107,10 @@ class Deque(Sequence): |
|
|
|
def fromcache(cls, cache, iterable=()): |
|
|
|
"""Initialize deque using `cache`. |
|
|
|
|
|
|
|
>>> cache = Cache('/tmp/diskcache/index') |
|
|
|
>>> _ = cache.clear() |
|
|
|
>>> cache = Cache() |
|
|
|
>>> deque = Deque.fromcache(cache, [5, 6, 7, 8]) |
|
|
|
>>> deque.cache is cache |
|
|
|
True |
|
|
|
>>> len(deque) |
|
|
|
4 |
|
|
|
>>> 7 in deque |
|
|
@ -178,7 +173,6 @@ class Deque(Sequence): |
|
|
|
raise IndexError('deque index out of range') |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def __getitem__(self, index): |
|
|
|
"""deque.__getitem__(index) <==> deque[index] |
|
|
|
|
|
|
@ -187,8 +181,7 @@ class Deque(Sequence): |
|
|
|
See also `Deque.peekleft` and `Deque.peek` for indexing deque at index |
|
|
|
``0`` or ``-1``. |
|
|
|
|
|
|
|
>>> deque = Deque(directory='/tmp/diskcache/deque') |
|
|
|
>>> deque.clear() |
|
|
|
>>> deque = Deque() |
|
|
|
>>> deque.extend('abcde') |
|
|
|
>>> deque[1] |
|
|
|
'b' |
|
|
@ -208,8 +201,7 @@ class Deque(Sequence): |
|
|
|
|
|
|
|
Store `value` in deque at `index`. |
|
|
|
|
|
|
|
>>> deque = Deque(directory='/tmp/diskcache/deque') |
|
|
|
>>> deque.clear() |
|
|
|
>>> deque = Deque() |
|
|
|
>>> deque.extend([None] * 3) |
|
|
|
>>> deque[0] = 'a' |
|
|
|
>>> deque[1] = 'b' |
|
|
@ -231,8 +223,7 @@ class Deque(Sequence): |
|
|
|
|
|
|
|
Delete item in deque at `index`. |
|
|
|
|
|
|
|
>>> deque = Deque(directory='/tmp/diskcache/deque') |
|
|
|
>>> deque.clear() |
|
|
|
>>> deque = Deque() |
|
|
|
>>> deque.extend([None] * 3) |
|
|
|
>>> del deque[0] |
|
|
|
>>> del deque[1] |
|
|
@ -307,8 +298,7 @@ class Deque(Sequence): |
|
|
|
|
|
|
|
Return iterator of deque from back to front. |
|
|
|
|
|
|
|
>>> deque = Deque(directory='/tmp/diskcache/deque') |
|
|
|
>>> deque.clear() |
|
|
|
>>> deque = Deque() |
|
|
|
>>> deque.extend('abcd') |
|
|
|
>>> iterator = reversed(deque) |
|
|
|
>>> next(iterator) |
|
|
@ -337,8 +327,7 @@ class Deque(Sequence): |
|
|
|
def append(self, value): |
|
|
|
"""Add `value` to back of deque. |
|
|
|
|
|
|
|
>>> deque = Deque(directory='/tmp/diskcache/deque') |
|
|
|
>>> deque.clear() |
|
|
|
>>> deque = Deque() |
|
|
|
>>> deque.append('a') |
|
|
|
>>> deque.append('b') |
|
|
|
>>> deque.append('c') |
|
|
@ -354,8 +343,7 @@ class Deque(Sequence): |
|
|
|
def appendleft(self, value): |
|
|
|
"""Add `value` to front of deque. |
|
|
|
|
|
|
|
>>> deque = Deque(directory='/tmp/diskcache/deque') |
|
|
|
>>> deque.clear() |
|
|
|
>>> deque = Deque() |
|
|
|
>>> deque.appendleft('a') |
|
|
|
>>> deque.appendleft('b') |
|
|
|
>>> deque.appendleft('c') |
|
|
@ -371,6 +359,13 @@ class Deque(Sequence): |
|
|
|
def clear(self): |
|
|
|
"""Remove all elements from deque. |
|
|
|
|
|
|
|
>>> deque = Deque('abc') |
|
|
|
>>> len(deque) |
|
|
|
3 |
|
|
|
>>> deque.clear() |
|
|
|
>>> list(deque) |
|
|
|
[] |
|
|
|
|
|
|
|
""" |
|
|
|
self._cache.clear(retry=True) |
|
|
|
|
|
|
@ -378,8 +373,7 @@ class Deque(Sequence): |
|
|
|
def count(self, value): |
|
|
|
"""Return number of occurrences of `value` in deque. |
|
|
|
|
|
|
|
>>> deque = Deque(directory='/tmp/diskcache/deque') |
|
|
|
>>> deque.clear() |
|
|
|
>>> deque = Deque() |
|
|
|
>>> deque += [num for num in range(1, 5) for _ in range(num)] |
|
|
|
>>> deque.count(0) |
|
|
|
0 |
|
|
@ -408,8 +402,7 @@ class Deque(Sequence): |
|
|
|
def extendleft(self, iterable): |
|
|
|
"""Extend front side of deque with value from `iterable`. |
|
|
|
|
|
|
|
>>> deque = Deque(directory='/tmp/diskcache/deque') |
|
|
|
>>> deque.clear() |
|
|
|
>>> deque = Deque() |
|
|
|
>>> deque.extendleft('abc') |
|
|
|
>>> list(deque) |
|
|
|
['c', 'b', 'a'] |
|
|
@ -428,8 +421,7 @@ class Deque(Sequence): |
|
|
|
|
|
|
|
If deque is empty then raise IndexError. |
|
|
|
|
|
|
|
>>> deque = Deque(directory='/tmp/diskcache/deque') |
|
|
|
>>> deque.clear() |
|
|
|
>>> deque = Deque() |
|
|
|
>>> deque.peek() |
|
|
|
Traceback (most recent call last): |
|
|
|
... |
|
|
@ -456,8 +448,7 @@ class Deque(Sequence): |
|
|
|
|
|
|
|
If deque is empty then raise IndexError. |
|
|
|
|
|
|
|
>>> deque = Deque(directory='/tmp/diskcache/deque') |
|
|
|
>>> deque.clear() |
|
|
|
>>> deque = Deque() |
|
|
|
>>> deque.peekleft() |
|
|
|
Traceback (most recent call last): |
|
|
|
... |
|
|
@ -482,8 +473,7 @@ class Deque(Sequence): |
|
|
|
|
|
|
|
If deque is empty then raise IndexError. |
|
|
|
|
|
|
|
>>> deque = Deque(directory='/tmp/diskcache/deque') |
|
|
|
>>> deque.clear() |
|
|
|
>>> deque = Deque() |
|
|
|
>>> deque += 'ab' |
|
|
|
>>> deque.pop() |
|
|
|
'b' |
|
|
@ -508,8 +498,7 @@ class Deque(Sequence): |
|
|
|
def popleft(self): |
|
|
|
"""Remove and return value at front of deque. |
|
|
|
|
|
|
|
>>> deque = Deque(directory='/tmp/diskcache/deque') |
|
|
|
>>> deque.clear() |
|
|
|
>>> deque = Deque() |
|
|
|
>>> deque += 'ab' |
|
|
|
>>> deque.popleft() |
|
|
|
'a' |
|
|
@ -534,8 +523,7 @@ class Deque(Sequence): |
|
|
|
def remove(self, value): |
|
|
|
"""Remove first occurrence of `value` in deque. |
|
|
|
|
|
|
|
>>> deque = Deque(directory='/tmp/diskcache/deque') |
|
|
|
>>> deque.clear() |
|
|
|
>>> deque = Deque() |
|
|
|
>>> deque += 'aab' |
|
|
|
>>> deque.remove('a') |
|
|
|
>>> list(deque) |
|
|
@ -573,8 +561,7 @@ class Deque(Sequence): |
|
|
|
def reverse(self): |
|
|
|
"""Reverse deque in place. |
|
|
|
|
|
|
|
>>> deque = Deque(directory='/tmp/diskcache/deque') |
|
|
|
>>> deque.clear() |
|
|
|
>>> deque = Deque() |
|
|
|
>>> deque += 'abc' |
|
|
|
>>> deque.reverse() |
|
|
|
>>> list(deque) |
|
|
@ -599,8 +586,7 @@ class Deque(Sequence): |
|
|
|
|
|
|
|
If steps is negative then rotate left. |
|
|
|
|
|
|
|
>>> deque = Deque(directory='/tmp/diskcache/deque') |
|
|
|
>>> deque.clear() |
|
|
|
>>> deque = Deque() |
|
|
|
>>> deque += range(5) |
|
|
|
>>> deque.rotate(2) |
|
|
|
>>> list(deque) |
|
|
@ -659,8 +645,7 @@ class Deque(Sequence): |
|
|
|
Transactions may be nested and may not be shared between threads. |
|
|
|
|
|
|
|
>>> from diskcache import Deque |
|
|
|
>>> deque = Deque(directory='/tmp/diskcache/deque') |
|
|
|
>>> deque.clear() |
|
|
|
>>> deque = Deque() |
|
|
|
>>> deque += range(5) |
|
|
|
>>> with deque.transact(): # Atomically rotate elements. |
|
|
|
... value = deque.pop() |
|
|
@ -669,7 +654,6 @@ class Deque(Sequence): |
|
|
|
[4, 0, 1, 2, 3] |
|
|
|
|
|
|
|
:return: context manager for use in `with` statement |
|
|
|
:raises Timeout: if database timeout occurs |
|
|
|
|
|
|
|
""" |
|
|
|
with self._cache.transact(retry=True): |
|
|
@ -685,10 +669,7 @@ class Index(MutableMapping): |
|
|
|
Hashing protocol is not used. Keys are looked up by their serialized |
|
|
|
format. See ``diskcache.Disk`` for details. |
|
|
|
|
|
|
|
>>> index = Index('/tmp/diskcache/index') |
|
|
|
>>> index |
|
|
|
Index('/tmp/diskcache/index') |
|
|
|
>>> index.clear() |
|
|
|
>>> index = Index() |
|
|
|
>>> index.update([('a', 1), ('b', 2), ('c', 3)]) |
|
|
|
>>> index['a'] |
|
|
|
1 |
|
|
@ -724,7 +705,7 @@ class Index(MutableMapping): |
|
|
|
else: |
|
|
|
if args and args[0] is None: |
|
|
|
args = args[1:] |
|
|
|
directory = mkdtemp(prefix='diskcache-') |
|
|
|
directory = None |
|
|
|
self._cache = Cache(directory, eviction_policy='none') |
|
|
|
self.update(*args, **kwargs) |
|
|
|
|
|
|
@ -733,9 +714,10 @@ class Index(MutableMapping): |
|
|
|
def fromcache(cls, cache, *args, **kwargs): |
|
|
|
"""Initialize index using `cache` and update items. |
|
|
|
|
|
|
|
>>> cache = Cache('/tmp/diskcache/index') |
|
|
|
>>> _ = cache.clear() |
|
|
|
>>> cache = Cache() |
|
|
|
>>> index = Index.fromcache(cache, {'a': 1, 'b': 2, 'c': 3}) |
|
|
|
>>> index.cache is cache |
|
|
|
True |
|
|
|
>>> len(index) |
|
|
|
3 |
|
|
|
>>> 'b' in index |
|
|
@ -773,8 +755,7 @@ class Index(MutableMapping): |
|
|
|
|
|
|
|
Return corresponding value for `key` in index. |
|
|
|
|
|
|
|
>>> index = Index('/tmp/diskcache/index') |
|
|
|
>>> index.clear() |
|
|
|
>>> index = Index() |
|
|
|
>>> index.update({'a': 1, 'b': 2}) |
|
|
|
>>> index['a'] |
|
|
|
1 |
|
|
@ -798,8 +779,7 @@ class Index(MutableMapping): |
|
|
|
|
|
|
|
Set `key` and `value` item in index. |
|
|
|
|
|
|
|
>>> index = Index('/tmp/diskcache/index') |
|
|
|
>>> index.clear() |
|
|
|
>>> index = Index() |
|
|
|
>>> index['a'] = 1 |
|
|
|
>>> index[0] = None |
|
|
|
>>> len(index) |
|
|
@ -817,8 +797,7 @@ class Index(MutableMapping): |
|
|
|
|
|
|
|
Delete corresponding item for `key` from index. |
|
|
|
|
|
|
|
>>> index = Index('/tmp/diskcache/index') |
|
|
|
>>> index.clear() |
|
|
|
>>> index = Index() |
|
|
|
>>> index.update({'a': 1, 'b': 2}) |
|
|
|
>>> del index['a'] |
|
|
|
>>> del index['b'] |
|
|
@ -842,8 +821,7 @@ class Index(MutableMapping): |
|
|
|
If `key` is not in index then set corresponding value to `default`. If |
|
|
|
`key` is in index then ignore `default` and return existing value. |
|
|
|
|
|
|
|
>>> index = Index('/tmp/diskcache/index') |
|
|
|
>>> index.clear() |
|
|
|
>>> index = Index() |
|
|
|
>>> index.setdefault('a', 0) |
|
|
|
0 |
|
|
|
>>> index.setdefault('a', 1) |
|
|
@ -865,8 +843,7 @@ class Index(MutableMapping): |
|
|
|
def peekitem(self, last=True): |
|
|
|
"""Peek at key and value item pair in index based on iteration order. |
|
|
|
|
|
|
|
>>> index = Index('/tmp/diskcache/index') |
|
|
|
>>> index.clear() |
|
|
|
>>> index = Index() |
|
|
|
>>> for num, letter in enumerate('xyz'): |
|
|
|
... index[letter] = num |
|
|
|
>>> index.peekitem() |
|
|
@ -888,7 +865,7 @@ class Index(MutableMapping): |
|
|
|
If `key` is missing then return `default`. If `default` is `ENOVAL` |
|
|
|
then raise KeyError. |
|
|
|
|
|
|
|
>>> index = Index('/tmp/diskcache/index', {'a': 1, 'b': 2}) |
|
|
|
>>> index = Index({'a': 1, 'b': 2}) |
|
|
|
>>> index.pop('a') |
|
|
|
1 |
|
|
|
>>> index.pop('b') |
|
|
@ -920,8 +897,7 @@ class Index(MutableMapping): |
|
|
|
True else first-in-first-out (FIFO) order. LIFO order imitates a stack |
|
|
|
and FIFO order imitates a queue. |
|
|
|
|
|
|
|
>>> index = Index('/tmp/diskcache/index') |
|
|
|
>>> index.clear() |
|
|
|
>>> index = Index() |
|
|
|
>>> index.update([('a', 1), ('b', 2), ('c', 3)]) |
|
|
|
>>> index.popitem() |
|
|
|
('c', 3) |
|
|
@ -932,7 +908,7 @@ class Index(MutableMapping): |
|
|
|
>>> index.popitem() |
|
|
|
Traceback (most recent call last): |
|
|
|
... |
|
|
|
KeyError |
|
|
|
KeyError: 'dictionary is empty' |
|
|
|
|
|
|
|
:param bool last: pop last item pair (default True) |
|
|
|
:return: key and value item pair |
|
|
@ -942,21 +918,11 @@ class Index(MutableMapping): |
|
|
|
# pylint: disable=arguments-differ |
|
|
|
_cache = self._cache |
|
|
|
|
|
|
|
while True: |
|
|
|
try: |
|
|
|
if last: |
|
|
|
key = next(reversed(_cache)) |
|
|
|
else: |
|
|
|
key = next(iter(_cache)) |
|
|
|
except StopIteration: |
|
|
|
raise KeyError |
|
|
|
with _cache.transact(retry=True): |
|
|
|
key, value = _cache.peekitem(last=last) |
|
|
|
del _cache[key] |
|
|
|
|
|
|
|
try: |
|
|
|
value = _cache.pop(key, retry=True) |
|
|
|
except KeyError: |
|
|
|
continue |
|
|
|
else: |
|
|
|
return key, value |
|
|
|
return key, value |
|
|
|
|
|
|
|
|
|
|
|
def push(self, value, prefix=None, side='back'): |
|
|
@ -970,8 +936,7 @@ class Index(MutableMapping): |
|
|
|
|
|
|
|
See also `Index.pull`. |
|
|
|
|
|
|
|
>>> index = Index('/tmp/diskcache/index') |
|
|
|
>>> index.clear() |
|
|
|
>>> index = Index() |
|
|
|
>>> print(index.push('apples')) |
|
|
|
500000000000000 |
|
|
|
>>> print(index.push('beans')) |
|
|
@ -1006,8 +971,7 @@ class Index(MutableMapping): |
|
|
|
|
|
|
|
See also `Index.push`. |
|
|
|
|
|
|
|
>>> index = Index('/tmp/diskcache/index') |
|
|
|
>>> index.clear() |
|
|
|
>>> index = Index() |
|
|
|
>>> for letter in 'abc': |
|
|
|
... print(index.push(letter)) |
|
|
|
500000000000000 |
|
|
@ -1037,6 +1001,13 @@ class Index(MutableMapping): |
|
|
|
def clear(self): |
|
|
|
"""Remove all items from index. |
|
|
|
|
|
|
|
>>> index = Index({'a': 0, 'b': 1, 'c': 2}) |
|
|
|
>>> len(index) |
|
|
|
3 |
|
|
|
>>> index.clear() |
|
|
|
>>> dict(index) |
|
|
|
{} |
|
|
|
|
|
|
|
""" |
|
|
|
self._cache.clear(retry=True) |
|
|
|
|
|
|
@ -1055,8 +1026,7 @@ class Index(MutableMapping): |
|
|
|
|
|
|
|
Return iterator of index keys in reversed insertion order. |
|
|
|
|
|
|
|
>>> index = Index('/tmp/diskcache/index') |
|
|
|
>>> index.clear() |
|
|
|
>>> index = Index() |
|
|
|
>>> index.update([('a', 1), ('b', 2), ('c', 3)]) |
|
|
|
>>> iterator = reversed(index) |
|
|
|
>>> next(iterator) |
|
|
@ -1081,8 +1051,7 @@ class Index(MutableMapping): |
|
|
|
def keys(self): |
|
|
|
"""List of index keys. |
|
|
|
|
|
|
|
>>> index = Index('/tmp/diskcache/index') |
|
|
|
>>> index.clear() |
|
|
|
>>> index = Index() |
|
|
|
>>> index.update([('a', 1), ('b', 2), ('c', 3)]) |
|
|
|
>>> index.keys() |
|
|
|
['a', 'b', 'c'] |
|
|
@ -1096,8 +1065,7 @@ class Index(MutableMapping): |
|
|
|
def values(self): |
|
|
|
"""List of index values. |
|
|
|
|
|
|
|
>>> index = Index('/tmp/diskcache/index') |
|
|
|
>>> index.clear() |
|
|
|
>>> index = Index() |
|
|
|
>>> index.update([('a', 1), ('b', 2), ('c', 3)]) |
|
|
|
>>> index.values() |
|
|
|
[1, 2, 3] |
|
|
@ -1111,8 +1079,7 @@ class Index(MutableMapping): |
|
|
|
def items(self): |
|
|
|
"""List of index items. |
|
|
|
|
|
|
|
>>> index = Index('/tmp/diskcache/index') |
|
|
|
>>> index.clear() |
|
|
|
>>> index = Index() |
|
|
|
>>> index.update([('a', 1), ('b', 2), ('c', 3)]) |
|
|
|
>>> index.items() |
|
|
|
[('a', 1), ('b', 2), ('c', 3)] |
|
|
@ -1126,8 +1093,7 @@ class Index(MutableMapping): |
|
|
|
def iterkeys(self): |
|
|
|
"""Iterator of index keys. |
|
|
|
|
|
|
|
>>> index = Index('/tmp/diskcache/index') |
|
|
|
>>> index.clear() |
|
|
|
>>> index = Index() |
|
|
|
>>> index.update([('a', 1), ('b', 2), ('c', 3)]) |
|
|
|
>>> list(index.iterkeys()) |
|
|
|
['a', 'b', 'c'] |
|
|
@ -1141,8 +1107,7 @@ class Index(MutableMapping): |
|
|
|
def itervalues(self): |
|
|
|
"""Iterator of index values. |
|
|
|
|
|
|
|
>>> index = Index('/tmp/diskcache/index') |
|
|
|
>>> index.clear() |
|
|
|
>>> index = Index() |
|
|
|
>>> index.update([('a', 1), ('b', 2), ('c', 3)]) |
|
|
|
>>> list(index.itervalues()) |
|
|
|
[1, 2, 3] |
|
|
@ -1164,8 +1129,7 @@ class Index(MutableMapping): |
|
|
|
def iteritems(self): |
|
|
|
"""Iterator of index items. |
|
|
|
|
|
|
|
>>> index = Index('/tmp/diskcache/index') |
|
|
|
>>> index.clear() |
|
|
|
>>> index = Index() |
|
|
|
>>> index.update([('a', 1), ('b', 2), ('c', 3)]) |
|
|
|
>>> list(index.iteritems()) |
|
|
|
[('a', 1), ('b', 2), ('c', 3)] |
|
|
@ -1187,8 +1151,7 @@ class Index(MutableMapping): |
|
|
|
def viewkeys(self): |
|
|
|
"""Set-like object providing a view of index keys. |
|
|
|
|
|
|
|
>>> index = Index('/tmp/diskcache/index') |
|
|
|
>>> index.clear() |
|
|
|
>>> index = Index() |
|
|
|
>>> index.update({'a': 1, 'b': 2, 'c': 3}) |
|
|
|
>>> keys_view = index.viewkeys() |
|
|
|
>>> 'b' in keys_view |
|
|
@ -1203,8 +1166,7 @@ class Index(MutableMapping): |
|
|
|
def viewvalues(self): |
|
|
|
"""Set-like object providing a view of index values. |
|
|
|
|
|
|
|
>>> index = Index('/tmp/diskcache/index') |
|
|
|
>>> index.clear() |
|
|
|
>>> index = Index() |
|
|
|
>>> index.update({'a': 1, 'b': 2, 'c': 3}) |
|
|
|
>>> values_view = index.viewvalues() |
|
|
|
>>> 2 in values_view |
|
|
@ -1219,8 +1181,7 @@ class Index(MutableMapping): |
|
|
|
def viewitems(self): |
|
|
|
"""Set-like object providing a view of index items. |
|
|
|
|
|
|
|
>>> index = Index('/tmp/diskcache/index') |
|
|
|
>>> index.clear() |
|
|
|
>>> index = Index() |
|
|
|
>>> index.update({'a': 1, 'b': 2, 'c': 3}) |
|
|
|
>>> items_view = index.viewitems() |
|
|
|
>>> ('b', 2) in items_view |
|
|
@ -1236,8 +1197,7 @@ class Index(MutableMapping): |
|
|
|
def keys(self): |
|
|
|
"""Set-like object providing a view of index keys. |
|
|
|
|
|
|
|
>>> index = Index('/tmp/diskcache/index') |
|
|
|
>>> index.clear() |
|
|
|
>>> index = Index() |
|
|
|
>>> index.update({'a': 1, 'b': 2, 'c': 3}) |
|
|
|
>>> keys_view = index.keys() |
|
|
|
>>> 'b' in keys_view |
|
|
@ -1252,8 +1212,7 @@ class Index(MutableMapping): |
|
|
|
def values(self): |
|
|
|
"""Set-like object providing a view of index values. |
|
|
|
|
|
|
|
>>> index = Index('/tmp/diskcache/index') |
|
|
|
>>> index.clear() |
|
|
|
>>> index = Index() |
|
|
|
>>> index.update({'a': 1, 'b': 2, 'c': 3}) |
|
|
|
>>> values_view = index.values() |
|
|
|
>>> 2 in values_view |
|
|
@ -1268,8 +1227,7 @@ class Index(MutableMapping): |
|
|
|
def items(self): |
|
|
|
"""Set-like object providing a view of index items. |
|
|
|
|
|
|
|
>>> index = Index('/tmp/diskcache/index') |
|
|
|
>>> index.clear() |
|
|
|
>>> index = Index() |
|
|
|
>>> index.update({'a': 1, 'b': 2, 'c': 3}) |
|
|
|
>>> items_view = index.items() |
|
|
|
>>> ('b', 2) in items_view |
|
|
@ -1300,8 +1258,7 @@ class Index(MutableMapping): |
|
|
|
Comparison to another index or ordered dictionary is |
|
|
|
order-sensitive. Comparison to all other mappings is order-insensitive. |
|
|
|
|
|
|
|
>>> index = Index('/tmp/diskcache/index') |
|
|
|
>>> index.clear() |
|
|
|
>>> index = Index() |
|
|
|
>>> pairs = [('a', 1), ('b', 2), ('c', 3)] |
|
|
|
>>> index.update(pairs) |
|
|
|
>>> from collections import OrderedDict |
|
|
@ -1335,8 +1292,7 @@ class Index(MutableMapping): |
|
|
|
Comparison to another index or ordered dictionary is |
|
|
|
order-sensitive. Comparison to all other mappings is order-insensitive. |
|
|
|
|
|
|
|
>>> index = Index('/tmp/diskcache/index') |
|
|
|
>>> index.clear() |
|
|
|
>>> index = Index() |
|
|
|
>>> index.update([('a', 1), ('b', 2), ('c', 3)]) |
|
|
|
>>> from collections import OrderedDict |
|
|
|
>>> od = OrderedDict([('c', 3), ('b', 2), ('a', 1)]) |
|
|
@ -1371,8 +1327,8 @@ class Index(MutableMapping): |
|
|
|
or for rewrapping the function with a different cache. |
|
|
|
|
|
|
|
>>> from diskcache import Index |
|
|
|
>>> mapping = Index('/tmp/diskcache/index') |
|
|
|
>>> @mapping.memoize(typed=True) |
|
|
|
>>> mapping = Index() |
|
|
|
>>> @mapping.memoize() |
|
|
|
... def fibonacci(number): |
|
|
|
... if number == 0: |
|
|
|
... return 0 |
|
|
@ -1380,8 +1336,15 @@ class Index(MutableMapping): |
|
|
|
... return 1 |
|
|
|
... else: |
|
|
|
... return fibonacci(number - 1) + fibonacci(number - 2) |
|
|
|
>>> print(sum(fibonacci(number=value) for value in range(100))) |
|
|
|
573147844013817084100 |
|
|
|
>>> print(fibonacci(100)) |
|
|
|
354224848179261915075 |
|
|
|
|
|
|
|
An additional `__cache_key__` attribute can be used to generate the |
|
|
|
cache key used for the given arguments. |
|
|
|
|
|
|
|
>>> key = fibonacci.__cache_key__(100) |
|
|
|
>>> print(mapping[key]) |
|
|
|
354224848179261915075 |
|
|
|
|
|
|
|
Remember to call memoize when decorating a callable. If you forget, |
|
|
|
then a TypeError will occur. Note the lack of parenthenses after |
|
|
@ -1414,7 +1377,7 @@ class Index(MutableMapping): |
|
|
|
Transactions may be nested and may not be shared between threads. |
|
|
|
|
|
|
|
>>> from diskcache import Index |
|
|
|
>>> mapping = Index('/tmp/diskcache/index') |
|
|
|
>>> mapping = Index() |
|
|
|
>>> with mapping.transact(): # Atomically increment two keys. |
|
|
|
... mapping['total'] = mapping.get('total', 0) + 123.4 |
|
|
|
... mapping['count'] = mapping.get('count', 0) + 1 |
|
|
@ -1424,7 +1387,6 @@ class Index(MutableMapping): |
|
|
|
123.4 |
|
|
|
|
|
|
|
:return: context manager for use in `with` statement |
|
|
|
:raises Timeout: if database timeout occurs |
|
|
|
|
|
|
|
""" |
|
|
|
with self._cache.transact(retry=True): |
|
|
|