mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
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).
This commit is contained in:
parent
1b8ca0d87a
commit
25786c0851
2 changed files with 80 additions and 3 deletions
|
@ -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 */
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue