Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit0fd074a

Browse files
committed
Replace key if not identical to old key
1 parent586b24d commit0fd074a

File tree

3 files changed

+38
-0
lines changed

3 files changed

+38
-0
lines changed

‎Lib/test/test_dict.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -618,6 +618,21 @@ def __hash__(self):
618618
withself.assertRaises(Exc):
619619
d1==d2
620620

621+
deftest_eq_replace(self):
622+
classAlwaysEqualCmp(object):
623+
def__eq__(self,other):
624+
returnTrue
625+
626+
def__hash__(self):
627+
return1
628+
629+
o1=AlwaysEqualCmp()
630+
d3= {}
631+
d3[o1]=1
632+
o2=AlwaysEqualCmp()
633+
d3[o2]=2
634+
asserttuple(d3.keys())[0]iso2
635+
621636
deftest_keys_contained(self):
622637
self.helper_keys_contained(lambdax:x.keys())
623638
self.helper_keys_contained(lambdax:x.items())

‎Lib/test/test_weakref.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1797,6 +1797,19 @@ def test_weak_keyed_bad_delitem(self):
17971797
self.assertRaises(TypeError,d.__getitem__,13)
17981798
self.assertRaises(TypeError,d.__setitem__,13,13)
17991799

1800+
deftest_weak_keyed_equal_replacement(self):
1801+
d=weakref.WeakKeyDictionary()
1802+
o1=Object('1')
1803+
o2=Object('1')
1804+
d[o1]=1
1805+
d[o2]=2
1806+
assertlen(d)==1
1807+
assertd[o2]==2
1808+
asserttuple(d.keys())[0]iso2
1809+
delo1
1810+
assertlen(d)==1
1811+
asserttuple(d.keys())[0]iso2
1812+
18001813
deftest_weak_keyed_cascading_deletes(self):
18011814
# SF bug 742860. For some reason, before 2.3 __delitem__ iterated
18021815
# over the keys via self.data.iterkeys(). If things vanished from

‎Objects/dictobject.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1222,6 +1222,7 @@ Consumes key and value references.
12221222
staticint
12231223
insertdict(PyDictObject*mp,PyObject*key,Py_hash_thash,PyObject*value)
12241224
{
1225+
PyObject*old_key;
12251226
PyObject*old_value;
12261227

12271228
if (DK_IS_UNICODE(mp->ma_keys)&& !PyUnicode_CheckExact(key)) {
@@ -1279,6 +1280,15 @@ insertdict(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject *value)
12791280
return0;
12801281
}
12811282

1283+
if (!DK_IS_UNICODE(mp->ma_keys)) {
1284+
PyDictKeyEntry*ep=&DK_ENTRIES(mp->ma_keys)[ix];
1285+
old_key=ep->me_key;
1286+
if (old_key!=key) {
1287+
ep->me_key=key;
1288+
key=old_key;
1289+
}
1290+
}
1291+
12821292
if (old_value!=value) {
12831293
if (_PyDict_HasSplitTable(mp)) {
12841294
mp->ma_values->values[ix]=value;

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp