-
Notifications
You must be signed in to change notification settings - Fork 777
Expand file tree
/
Copy pathcollections.py
More file actions
107 lines (88 loc) · 3.08 KB
/
collections.py
File metadata and controls
107 lines (88 loc) · 3.08 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
"""
Implements collections.abc for common .NET types
https://docs.python.org/3/library/collections.abc.html
"""
import collections.abc as col
class ContextManagerMixin:
"""Implements Python's context manager protocol for .NET IDisposable types"""
def __enter__(self):
"""Return self for use in the with block"""
return self
def __exit__(self, exc_type, exc_val, exc_tb):
"""Call Dispose() when exiting the with block"""
if hasattr(self, 'Dispose'):
self.Dispose()
else:
from System import IDisposable
IDisposable(self).Dispose()
# Return False to indicate that exceptions should propagate
return False
class IteratorMixin(col.Iterator):
def close(self):
if hasattr(self, 'Dispose'):
self.Dispose()
else:
from System import IDisposable
IDisposable(self).Dispose()
class IterableMixin(col.Iterable):
pass
class SizedMixin(col.Sized):
def __len__(self): return self.Count
class ContainerMixin(col.Container):
def __contains__(self, item):
if hasattr('self', 'Contains'):
return self.Contains(item)
else:
from System.Collections.Generic import ICollection
return ICollection(self).Contains(item)
try:
abc_Collection = col.Collection
except AttributeError:
# Python 3.5- does not have collections.abc.Collection
abc_Collection = col.Container
class CollectionMixin(SizedMixin, IterableMixin, ContainerMixin, abc_Collection):
pass
class SequenceMixin(CollectionMixin, col.Sequence):
pass
class MutableSequenceMixin(SequenceMixin, col.MutableSequence):
pass
class MappingMixin(CollectionMixin, col.Mapping):
def __contains__(self, item): return self.ContainsKey(item)
def keys(self): return self.Keys
def items(self): return [(k,self.get(k)) for k in self.Keys]
def values(self): return self.Values
def __iter__(self): return self.Keys.__iter__()
def get(self, key, default=None):
existed, item = self.TryGetValue(key, None)
return item if existed else default
class MutableMappingMixin(MappingMixin, col.MutableMapping):
_UNSET_ = object()
def __delitem__(self, key):
self.Remove(key)
def clear(self):
self.Clear()
def pop(self, key, default=_UNSET_):
existed, item = self.TryGetValue(key, None)
if existed:
self.Remove(key)
return item
elif default == self._UNSET_:
raise KeyError(key)
else:
return default
def setdefault(self, key, value=None):
existed, item = self.TryGetValue(key, None)
if existed:
return item
else:
self[key] = value
return value
def update(self, items, **kwargs):
if isinstance(items, col.Mapping):
for key, value in items.items():
self[key] = value
else:
for key, value in items:
self[key] = value
for key, value in kwargs.items():
self[key] = value