@@ -498,6 +498,31 @@ PyDict_GetItem(PyObject *op, PyObject *key)
498498 return (mp -> ma_lookup )(mp , key , hash )-> me_value ;
499499}
500500
501+ static PyObject *
502+ dict_getitem (PyObject * op , PyObject * key )
503+ {
504+ long hash ;
505+ dictobject * mp = (dictobject * )op ;
506+ PyObject * v ;
507+
508+ if (!PyDict_Check (op )) {
509+ return NULL ;
510+ }
511+ if (!PyString_CheckExact (key ) ||
512+ (hash = ((PyStringObject * ) key )-> ob_shash ) == -1 )
513+ {
514+ hash = PyObject_Hash (key );
515+ if (hash == -1 )
516+ return NULL ;
517+ }
518+ v = (mp -> ma_lookup )(mp , key , hash ) -> me_value ;
519+ if (v == NULL )
520+ PyErr_SetObject (PyExc_KeyError , key );
521+ else
522+ Py_INCREF (v );
523+ return v ;
524+ }
525+
501526/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the
502527 * dictionary if it is merely replacing the value for an existing key.
503528 * This is means that it's safe to loop over a dictionary with
@@ -1735,6 +1760,11 @@ dict_iteritems(dictobject *dict)
17351760PyDoc_STRVAR (has_key__doc__ ,
17361761"D.has_key(k) -> True if D has a key k, else False" );
17371762
1763+ PyDoc_STRVAR (contains__doc__ ,
1764+ "D.__contains__(k) -> True if D has a key k, else False" );
1765+
1766+ PyDoc_STRVAR (getitem__doc__ , "x.__getitem__(y) <==> x[y]" );
1767+
17381768PyDoc_STRVAR (get__doc__ ,
17391769"D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None." );
17401770
@@ -1781,6 +1811,10 @@ PyDoc_STRVAR(iteritems__doc__,
17811811"D.iteritems() -> an iterator over the (key, value) items of D" );
17821812
17831813static PyMethodDef mapp_methods [] = {
1814+ {"__contains__" ,(PyCFunction )dict_has_key , METH_O | METH_COEXIST ,
1815+ contains__doc__ },
1816+ {"__getitem__" , (PyCFunction )dict_getitem , METH_O | METH_COEXIST ,
1817+ getitem__doc__ },
17841818 {"has_key" , (PyCFunction )dict_has_key , METH_O ,
17851819 has_key__doc__ },
17861820 {"get" , (PyCFunction )dict_get , METH_VARARGS ,
0 commit comments