[Python-checkins] python/dist/src/Objects dictobject.c,2.131,2.132

rhettinger@users.sourceforge.net rhettinger@users.sourceforge.net
Tue, 26 Nov 2002 23:29:35 -0800


Update of /cvsroot/python/python/dist/src/Objects
In directory sc8-pr-cvs1:/tmp/cvs-serv24449a/Objects

Modified Files:
	dictobject.c 
Log Message:
SF Patch 643443.  Added dict.fromkeys(iterable, value=None), a class
method for constructing new dictionaries from sequences of keys.



Index: dictobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/dictobject.c,v
retrieving revision 2.131
retrieving revision 2.132
diff -C2 -d -r2.131 -r2.132
*** dictobject.c	23 Nov 2002 09:45:04 -0000	2.131
--- dictobject.c	27 Nov 2002 07:29:33 -0000	2.132
***************
*** 964,967 ****
--- 964,1017 ----
  
  static PyObject *
+ dict_fromkeys(PyObject *mp, PyObject *args)
+ {
+ 	PyObject *seq;
+ 	PyObject *value = Py_None;
+ 	PyObject *it;	/* iter(seq) */
+ 	PyObject *key;
+ 	PyObject *d;
+ 	PyObject *cls;
+ 	int status;
+ 
+         if (!PyArg_ParseTuple(args, "OO|O:fromkeys", &cls, &seq, &value))
+ 		return NULL;
+ 
+ 	d = PyObject_CallObject(cls, NULL);
+ 	if (d == NULL)
+ 		return NULL;
+ 	if (!PyDict_Check(d)) {
+ 		PyErr_BadInternalCall();
+ 		return NULL;
+ 	}
+ 
+ 	it = PyObject_GetIter(seq);
+ 	if (it == NULL){
+ 		Py_DECREF(d);
+ 		return NULL;
+ 	}
+ 
+ 	for (;;) {
+ 		key = PyIter_Next(it);
+ 		if (key == NULL) {
+ 			if (PyErr_Occurred())
+ 				goto Fail;
+ 			break;
+ 		}
+ 		status = PyDict_SetItem(d, key, value);
+ 		Py_DECREF(key);
+ 		if (status < 0)
+ 			goto Fail;
+ 	}
+ 
+ 	Py_DECREF(it);
+ 	return d;
+ 
+ Fail:
+ 	Py_DECREF(it);
+ 	Py_DECREF(d);
+ 	return NULL;
+ }
+ 
+ static PyObject *
  dict_update(PyObject *mp, PyObject *other)
  {
***************
*** 1683,1686 ****
--- 1733,1740 ----
  "D.update(E) -> None.  Update D from E: for k in E.keys(): D[k] = E[k]");
  
+ PyDoc_STRVAR(fromkeys__doc__,
+ "dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v.\n\
+ v defaults to None.");
+ 
  PyDoc_STRVAR(clear__doc__,
  "D.clear() -> None.  Remove all items from D.");
***************
*** 1717,1720 ****
--- 1771,1776 ----
  	{"update",	(PyCFunction)dict_update,	METH_O,
  	 update__doc__},
+ 	{"fromkeys",	(PyCFunction)dict_fromkeys,	METH_VARARGS | METH_CLASS,
+ 	 fromkeys__doc__},
  	{"clear",	(PyCFunction)dict_clear,	METH_NOARGS,
  	 clear__doc__},