diff options
author | Tim Peters <tim.peters@gmail.com> | 2001-09-02 08:22:48 (GMT) |
---|---|---|
committer | Tim Peters <tim.peters@gmail.com> | 2001-09-02 08:22:48 (GMT) |
commit | 25786c0851da8665bdbba948ddb16b23a040bbb2 (patch) | |
tree | 6bbe5fef549dc5105b642567c9ce1e0e87a0b94f /Objects/dictobject.c | |
parent | 1b8ca0d87a806a5098496ad4864a975707cd6bac (diff) | |
download | cpython-25786c0851da8665bdbba948ddb16b23a040bbb2.zip cpython-25786c0851da8665bdbba948ddb16b23a040bbb2.tar.gz cpython-25786c0851da8665bdbba948ddb16b23a040bbb2.tar.bz2 |
Make dictionary() a real constructor. Accepts at most one argument, "a
mapping object", in the same sense dict.update(x) requires of x (that x
has a keys() method and a getitem).
Questionable: The other type constructors accept a keyword argument, so I
did that here too (e.g., dictionary(mapping={1:2}) works). But type_call
doesn't pass the keyword args to the tp_new slot (it passes NULL), it only
passes them to the tp_init slot, so getting at them required adding a
tp_init slot to dicts. Looks like that makes the normal case (i.e., no
args at all) a little slower (the time it takes to call dict.tp_init and
have it figure out there's nothing to do).
Diffstat (limited to 'Objects/dictobject.c')
-rw-r--r-- | Objects/dictobject.c | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/Objects/dictobject.c b/Objects/dictobject.c index e8a564e..91d2c53 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -1692,12 +1692,39 @@ dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds) return self; } +static int +dict_init(PyObject *self, PyObject *args, PyObject *kwds) +{ + PyObject *arg = NULL; + static char *kwlist[] = {"mapping", 0}; + + if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:dictionary", + kwlist, &arg)) + return -1; + if (arg != NULL) { + if (PyDict_Merge(self, arg, 1) < 0) { + /* An error like "AttibuteError: keys" is too + cryptic in this context. */ + if (PyErr_ExceptionMatches(PyExc_AttributeError)) { + PyErr_SetString(PyExc_TypeError, + "argument must be of a mapping type"); + } + return -1; + } + } + return 0; +} + static PyObject * dict_iter(dictobject *dict) { return dictiter_new(dict, select_key); } +static char dictionary_doc[] = +"dictionary() -> new empty dictionary\n" +"dictionary(mapping) -> new dict initialized from mapping's key+value pairs"; + PyTypeObject PyDict_Type = { PyObject_HEAD_INIT(&PyType_Type) 0, @@ -1721,7 +1748,7 @@ PyTypeObject PyDict_Type = { 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, /* tp_flags */ - "dictionary type", /* tp_doc */ + dictionary_doc, /* tp_doc */ (traverseproc)dict_traverse, /* tp_traverse */ (inquiry)dict_tp_clear, /* tp_clear */ dict_richcompare, /* tp_richcompare */ @@ -1736,7 +1763,7 @@ PyTypeObject PyDict_Type = { 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ - 0, /* tp_init */ + (initproc)dict_init, /* tp_init */ PyType_GenericAlloc, /* tp_alloc */ dict_new, /* tp_new */ }; |