[Python-checkins] CVS: python/dist/src/Objects dictobject.c,2.76,2.77
Guido van Rossum
gvanrossum@users.sourceforge.net
2001年4月20日 09:50:42 -0700
Update of /cvsroot/python/python/dist/src/Objects
In directory usw-pr-cvs1:/tmp/cvs-serv7993/Objects
Modified Files:
dictobject.c
Log Message:
Implement, test and document "key in dict" and "key not in dict".
I know some people don't like this -- if it's really controversial,
I'll take it out again. (If it's only Alex Martelli who doesn't like
it, that doesn't count as "real controversial" though. :-)
That's why this is a separate checkin from the iterators stuff I'm
about to check in next.
Index: dictobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/dictobject.c,v
retrieving revision 2.76
retrieving revision 2.77
diff -C2 -r2.76 -r2.77
*** dictobject.c 2001年04月16日 00:02:32 2.76
--- dictobject.c 2001年04月20日 16:50:40 2.77
***************
*** 1293,1296 ****
--- 1293,1330 ----
}
+ static int
+ dict_contains(dictobject *mp, PyObject *key)
+ {
+ long hash;
+
+ #ifdef CACHE_HASH
+ if (!PyString_Check(key) ||
+ (hash = ((PyStringObject *) key)->ob_shash) == -1)
+ #endif
+ {
+ hash = PyObject_Hash(key);
+ if (hash == -1)
+ return -1;
+ }
+ return (mp->ma_size != 0
+ && (mp->ma_lookup)(mp, key, hash)->me_value != NULL);
+ }
+
+ staticforward PyObject *dictiter_new(dictobject *);
+
+ /* Hack to implement "key in dict" */
+ static PySequenceMethods dict_as_sequence = {
+ 0, /* sq_length */
+ 0, /* sq_concat */
+ 0, /* sq_repeat */
+ 0, /* sq_item */
+ 0, /* sq_slice */
+ 0, /* sq_ass_item */
+ 0, /* sq_ass_slice */
+ (objobjproc)dict_contains, /* sq_contains */
+ 0, /* sq_inplace_concat */
+ 0, /* sq_inplace_repeat */
+ };
+
PyTypeObject PyDict_Type = {
PyObject_HEAD_INIT(&PyType_Type)
***************
*** 1306,1310 ****
(reprfunc)dict_repr, /* tp_repr */
0, /* tp_as_number */
! 0, /* tp_as_sequence */
&dict_as_mapping, /* tp_as_mapping */
0, /* tp_hash */
--- 1340,1344 ----
(reprfunc)dict_repr, /* tp_repr */
0, /* tp_as_number */
! &dict_as_sequence, /* tp_as_sequence */
&dict_as_mapping, /* tp_as_mapping */
0, /* tp_hash */