diff options
author | Guido van Rossum <guido@python.org> | 2001-08-10 20:28:28 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 2001-08-10 20:28:28 (GMT) |
commit | 05ac6de2d505b0cd69278e05be8bad3f0111e72d (patch) | |
tree | fb7c671d094e9bd9fb4fe5c9677846e3cc6a6fdd | |
parent | f4aa684132a2752118af9a2412f0acc90c258035 (diff) | |
download | cpython-05ac6de2d505b0cd69278e05be8bad3f0111e72d.zip cpython-05ac6de2d505b0cd69278e05be8bad3f0111e72d.tar.gz cpython-05ac6de2d505b0cd69278e05be8bad3f0111e72d.tar.bz2 |
Add PyDict_Merge(a, b, override):
PyDict_Merge(a, b, 1) is the same as PyDict_Update(a, b).
PyDict_Merge(a, b, 0) does something similar but leaves existing items
unchanged.
-rw-r--r-- | Include/dictobject.h | 1 | ||||
-rw-r--r-- | Objects/dictobject.c | 20 |
2 files changed, 19 insertions, 2 deletions
diff --git a/Include/dictobject.h b/Include/dictobject.h index abc8ed5..1132021 100644 --- a/Include/dictobject.h +++ b/Include/dictobject.h @@ -98,6 +98,7 @@ extern DL_IMPORT(PyObject *) PyDict_Items(PyObject *mp); extern DL_IMPORT(int) PyDict_Size(PyObject *mp); extern DL_IMPORT(PyObject *) PyDict_Copy(PyObject *mp); extern DL_IMPORT(int) PyDict_Update(PyObject *mp, PyObject *other); +extern DL_IMPORT(int) PyDict_Merge(PyObject *mp, PyObject *other, int override); extern DL_IMPORT(PyObject *) PyDict_GetItemString(PyObject *dp, char *key); diff --git a/Objects/dictobject.c b/Objects/dictobject.c index ce4c578..73c459f 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -999,9 +999,19 @@ dict_update(PyObject *mp, PyObject *args) return Py_None; } +/* Update unconditionally replaces existing items. + Merge has a 3rd argument 'override'; if set, it acts like Update, + otherwise it leaves existing items unchanged. */ + int PyDict_Update(PyObject *a, PyObject *b) { + return PyDict_Merge(a, b, 1); +} + +int +PyDict_Merge(PyObject *a, PyObject *b, int override) +{ register PyDictObject *mp, *other; register int i; dictentry *entry; @@ -1031,7 +1041,9 @@ PyDict_Update(PyObject *a, PyObject *b) } for (i = 0; i <= other->ma_mask; i++) { entry = &other->ma_table[i]; - if (entry->me_value != NULL) { + if (entry->me_value != NULL && + (override || + PyDict_GetItem(a, entry->me_key) == NULL)) { Py_INCREF(entry->me_key); Py_INCREF(entry->me_value); insertdict(mp, entry->me_key, entry->me_hash, @@ -1060,13 +1072,17 @@ PyDict_Update(PyObject *a, PyObject *b) return -1; for (key = PyIter_Next(iter); key; key = PyIter_Next(iter)) { + if (!override && PyDict_GetItem(a, key) != NULL) { + Py_DECREF(key); + continue; + } value = PyObject_GetItem(b, key); if (value == NULL) { Py_DECREF(iter); Py_DECREF(key); return -1; } - status = PyDict_SetItem((PyObject*)mp, key, value); + status = PyDict_SetItem(a, key, value); Py_DECREF(key); Py_DECREF(value); if (status < 0) { |