Skip to content

Commit 32aa993

Browse files
Phosphorescenttyouknowone
authored andcommitted
Updated __init__.py to be inline with CPython 3.11.2
1 parent a354f7b commit 32aa993

File tree

2 files changed

+66
-50
lines changed

2 files changed

+66
-50
lines changed

Lib/collections/__init__.py

Lines changed: 66 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -240,11 +240,19 @@ def pop(self, key, default=__marker):
240240
is raised.
241241
242242
'''
243-
if key in self:
244-
result = self[key]
245-
del self[key]
243+
marker = self.__marker
244+
result = dict.pop(self, key, marker)
245+
if result is not marker:
246+
# The same as in __delitem__().
247+
link = self.__map.pop(key)
248+
link_prev = link.prev
249+
link_next = link.next
250+
link_prev.next = link_next
251+
link_next.prev = link_prev
252+
link.prev = None
253+
link.next = None
246254
return result
247-
if default is self.__marker:
255+
if default is marker:
248256
raise KeyError(key)
249257
return default
250258

@@ -267,10 +275,22 @@ def __repr__(self):
267275

268276
def __reduce__(self):
269277
'Return state information for pickling'
270-
inst_dict = vars(self).copy()
271-
for k in vars(OrderedDict()):
272-
inst_dict.pop(k, None)
273-
return self.__class__, (), inst_dict or None, None, iter(self.items())
278+
state = self.__getstate__()
279+
if state:
280+
if isinstance(state, tuple):
281+
state, slots = state
282+
else:
283+
slots = {}
284+
state = state.copy()
285+
slots = slots.copy()
286+
for k in vars(OrderedDict()):
287+
state.pop(k, None)
288+
slots.pop(k, None)
289+
if slots:
290+
state = state, slots
291+
else:
292+
state = state or None
293+
return self.__class__, (), state, None, iter(self.items())
274294

275295
def copy(self):
276296
'od.copy() -> a shallow copy of od'
@@ -613,11 +633,9 @@ def elements(self):
613633
['A', 'A', 'B', 'B', 'C', 'C']
614634
615635
# Knuth's example for prime factors of 1836: 2**2 * 3**3 * 17**1
636+
>>> import math
616637
>>> prime_factors = Counter({2: 2, 3: 3, 17: 1})
617-
>>> product = 1
618-
>>> for factor in prime_factors.elements(): # loop over factors
619-
... product *= factor # and multiply them
620-
>>> product
638+
>>> math.prod(prime_factors.elements())
621639
1836
622640
623641
Note, if an element's count has been set to zero or is a negative
@@ -714,42 +732,6 @@ def __delitem__(self, elem):
714732
if elem in self:
715733
super().__delitem__(elem)
716734

717-
def __eq__(self, other):
718-
'True if all counts agree. Missing counts are treated as zero.'
719-
if not isinstance(other, Counter):
720-
return NotImplemented
721-
return all(self[e] == other[e] for c in (self, other) for e in c)
722-
723-
def __ne__(self, other):
724-
'True if any counts disagree. Missing counts are treated as zero.'
725-
if not isinstance(other, Counter):
726-
return NotImplemented
727-
return not self == other
728-
729-
def __le__(self, other):
730-
'True if all counts in self are a subset of those in other.'
731-
if not isinstance(other, Counter):
732-
return NotImplemented
733-
return all(self[e] <= other[e] for c in (self, other) for e in c)
734-
735-
def __lt__(self, other):
736-
'True if all counts in self are a proper subset of those in other.'
737-
if not isinstance(other, Counter):
738-
return NotImplemented
739-
return self <= other and self != other
740-
741-
def __ge__(self, other):
742-
'True if all counts in self are a superset of those in other.'
743-
if not isinstance(other, Counter):
744-
return NotImplemented
745-
return all(self[e] >= other[e] for c in (self, other) for e in c)
746-
747-
def __gt__(self, other):
748-
'True if all counts in self are a proper superset of those in other.'
749-
if not isinstance(other, Counter):
750-
return NotImplemented
751-
return self >= other and self != other
752-
753735
def __repr__(self):
754736
if not self:
755737
return f'{self.__class__.__name__}()'
@@ -795,6 +777,42 @@ def __repr__(self):
795777
# (cp >= cq) == (sp >= sq)
796778
# (cp > cq) == (sp > sq)
797779

780+
def __eq__(self, other):
781+
'True if all counts agree. Missing counts are treated as zero.'
782+
if not isinstance(other, Counter):
783+
return NotImplemented
784+
return all(self[e] == other[e] for c in (self, other) for e in c)
785+
786+
def __ne__(self, other):
787+
'True if any counts disagree. Missing counts are treated as zero.'
788+
if not isinstance(other, Counter):
789+
return NotImplemented
790+
return not self == other
791+
792+
def __le__(self, other):
793+
'True if all counts in self are a subset of those in other.'
794+
if not isinstance(other, Counter):
795+
return NotImplemented
796+
return all(self[e] <= other[e] for c in (self, other) for e in c)
797+
798+
def __lt__(self, other):
799+
'True if all counts in self are a proper subset of those in other.'
800+
if not isinstance(other, Counter):
801+
return NotImplemented
802+
return self <= other and self != other
803+
804+
def __ge__(self, other):
805+
'True if all counts in self are a superset of those in other.'
806+
if not isinstance(other, Counter):
807+
return NotImplemented
808+
return all(self[e] >= other[e] for c in (self, other) for e in c)
809+
810+
def __gt__(self, other):
811+
'True if all counts in self are a proper superset of those in other.'
812+
if not isinstance(other, Counter):
813+
return NotImplemented
814+
return self >= other and self != other
815+
798816
def __add__(self, other):
799817
'''Add counts from two counters.
800818

Lib/test/test_ordered_dict.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -983,8 +983,6 @@ def test_popitem(self):
983983
self.assertEqual(c.popitem(last=True), (3, 3))
984984
self.assertEqual(c.counts, {'get': 0, 'set': 3, 'del': 0})
985985

986-
# TODO: RUSTPYTHON
987-
@unittest.expectedFailure
988986
def test_pop(self):
989987
c = self.type2test(3)
990988
for i in range(1, 4):

0 commit comments

Comments
 (0)