Get rid of dict.has_key(). Boy this has a lot of repercussions!
Not all code has been fixed yet; this is just a checkpoint...
The C API still has PyDict_HasKey() and _HasKeyString(); not sure
if I want to change those just yet.
diff --git a/Modules/bsddbmodule.c b/Modules/bsddbmodule.c
index 61c6564..cccdf2a 100644
--- a/Modules/bsddbmodule.c
+++ b/Modules/bsddbmodule.c
@@ -461,7 +461,7 @@
 }
 
 static PyObject *
-bsddb_has_key(bsddbobject *dp, PyObject *args)
+bsddb_contains(bsddbobject *dp, PyObject *args)
 {
 	DBT krec, drec;
 	int status;
@@ -640,7 +640,7 @@
 static PyMethodDef bsddb_methods[] = {
 	{"close",		(PyCFunction)bsddb_close, METH_NOARGS},
 	{"keys",		(PyCFunction)bsddb_keys, METH_NOARGS},
-	{"has_key",		(PyCFunction)bsddb_has_key, METH_VARARGS},
+	{"__contains__",	(PyCFunction)bsddb_contains, METH_VARARGS},
 	{"set_location",	(PyCFunction)bsddb_set_location, METH_VARARGS},
 	{"next",		(PyCFunction)bsddb_next, METH_NOARGS},
 	{"previous",	(PyCFunction)bsddb_previous, METH_NOARGS},
diff --git a/Modules/dbmmodule.c b/Modules/dbmmodule.c
index 9086c84..a75a9bd 100644
--- a/Modules/dbmmodule.c
+++ b/Modules/dbmmodule.c
@@ -206,12 +206,12 @@
 }
 
 static PyObject *
-dbm_has_key(register dbmobject *dp, PyObject *args)
+dbm_contains(register dbmobject *dp, PyObject *args)
 {
 	datum key, val;
 	int tmp_size;
 	
-	if (!PyArg_ParseTuple(args, "s#:has_key", &key.dptr, &tmp_size))
+	if (!PyArg_ParseTuple(args, "s#:__contains__", &key.dptr, &tmp_size))
 		return NULL;
 	key.dsize = tmp_size;
         check_dbmobject_open(dp);
@@ -277,8 +277,8 @@
 	 "close()\nClose the database."},
 	{"keys",	(PyCFunction)dbm_keys,		METH_NOARGS,
 	 "keys() -> list\nReturn a list of all keys in the database."},
-	{"has_key",	(PyCFunction)dbm_has_key,	METH_VARARGS,
-	 "has_key(key} -> boolean\nReturn true iff key is in the database."},
+	{"__contains__",(PyCFunction)dbm_contains,	METH_VARARGS,
+	 "__contains__(key} -> boolean\True iff key is in the database."},
 	{"get",		(PyCFunction)dbm_get,		METH_VARARGS,
 	 "get(key[, default]) -> value\n"
 	 "Return the value for key if present, otherwise default."},
diff --git a/Modules/gdbmmodule.c b/Modules/gdbmmodule.c
index cfc6abc..0da93ec 100644
--- a/Modules/gdbmmodule.c
+++ b/Modules/gdbmmodule.c
@@ -241,16 +241,16 @@
     return v;
 }
 
-PyDoc_STRVAR(dbm_has_key__doc__,
-"has_key(key) -> boolean\n\
+PyDoc_STRVAR(dbm_contains__doc__,
+"__contains__(key) -> bool\n\
 Find out whether or not the database contains a given key.");
 
 static PyObject *
-dbm_has_key(register dbmobject *dp, PyObject *args)
+dbm_contains(register dbmobject *dp, PyObject *args)
 {
     datum key;
 
-    if (!PyArg_ParseTuple(args, "s#:has_key", &key.dptr, &key.dsize))
+    if (!PyArg_ParseTuple(args, "s#:contains", &key.dptr, &key.dsize))
         return NULL;
     check_dbmobject_open(dp);
     return PyInt_FromLong((long) gdbm_exists(dp->di_dbm, key));
@@ -355,7 +355,7 @@
 static PyMethodDef dbm_methods[] = {
     {"close",	  (PyCFunction)dbm_close,   METH_NOARGS, dbm_close__doc__},
     {"keys",	  (PyCFunction)dbm_keys,    METH_NOARGS, dbm_keys__doc__},
-    {"has_key",   (PyCFunction)dbm_has_key, METH_VARARGS, dbm_has_key__doc__},
+    {"__contains__",(PyCFunction)dbm_contains,METH_VARARGS, dbm_contains__doc__},
     {"firstkey",  (PyCFunction)dbm_firstkey,METH_NOARGS, dbm_firstkey__doc__},
     {"nextkey",	  (PyCFunction)dbm_nextkey, METH_VARARGS, dbm_nextkey__doc__},
     {"reorganize",(PyCFunction)dbm_reorganize,METH_NOARGS, dbm_reorganize__doc__},