Add Raymond Hettinger's d.pop().  See SF patch 539949.
diff --git a/Doc/lib/libstdtypes.tex b/Doc/lib/libstdtypes.tex
index f42f84e..a619105 100644
--- a/Doc/lib/libstdtypes.tex
+++ b/Doc/lib/libstdtypes.tex
@@ -992,6 +992,9 @@
           {\code{\var{a}[\var{k}]} if \code{\var{k} in \var{a}},
            else \var{x} (also setting it)}
           {(5)}
+  \lineiii{\var{a}.pop(\var{k})}
+          {remove specified \var{key} and return corresponding \var{value}}
+          {}			     
   \lineiii{\var{a}.popitem()}
           {remove and return an arbitrary (\var{key}, \var{value}) pair}
           {(6)}
diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py
index 26535c4..9d4508b 100644
--- a/Lib/test/test_types.py
+++ b/Lib/test/test_types.py
@@ -476,6 +476,21 @@
 except KeyError: pass
 else: raise TestFailed, "{}.popitem doesn't raise KeyError"
 
+# Tests for pop with specified key
+d.clear()
+k, v = 'abc', 'def'
+d[k] = v
+try: d.pop('ghi')
+except KeyError: pass
+else: raise TestFailed, "{}.pop(k) doesn't raise KeyError when k not in dictionary"
+
+if d.pop(k) != v: raise TestFailed, "{}.pop(k) doesn't find known key/value pair"
+if len(d) > 0: raise TestFailed, "{}.pop(k) failed to remove the specified pair"
+
+try: d.pop(k)
+except KeyError: pass
+else: raise TestFailed, "{}.pop(k) doesn't raise KeyError when dictionary is empty"
+
 d[1] = 1
 try:
     for i in d:
diff --git a/Objects/dictobject.c b/Objects/dictobject.c
index ffc0579..1bd2f64 100644
--- a/Objects/dictobject.c
+++ b/Objects/dictobject.c
@@ -1495,6 +1495,39 @@
 }
 
 static PyObject *
+dict_pop(dictobject *mp, PyObject *key)
+{
+	long hash;
+	dictentry *ep;
+	PyObject *old_value, *old_key;
+
+	if (mp->ma_used == 0) {
+		PyErr_SetString(PyExc_KeyError,
+				"pop(): dictionary is empty");
+		return NULL;
+	}
+	if (!PyString_CheckExact(key) ||
+	    (hash = ((PyStringObject *) key)->ob_shash) == -1) {
+		hash = PyObject_Hash(key);
+		if (hash == -1)
+			return NULL;
+	}
+	ep = (mp->ma_lookup)(mp, key, hash);
+	if (ep->me_value == NULL) {
+		PyErr_SetObject(PyExc_KeyError, key);
+		return NULL;
+	}
+	old_key = ep->me_key;
+	Py_INCREF(dummy);
+	ep->me_key = dummy;
+	old_value = ep->me_value;
+	ep->me_value = NULL;
+	mp->ma_used--;
+	Py_DECREF(old_key);
+	return old_value;
+}
+
+static PyObject *
 dict_popitem(dictobject *mp)
 {
 	int i = 0;
@@ -1636,6 +1669,9 @@
 static char setdefault_doc__[] =
 "D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if not D.has_key(k)";
 
+static char pop__doc__[] =
+"D.pop(k) -> v, remove specified key and return the corresponding value";
+
 static char popitem__doc__[] =
 "D.popitem() -> (k, v), remove and return some (key, value) pair as a\n\
 2-tuple; but raise KeyError if D is empty";
@@ -1674,6 +1710,8 @@
 	 get__doc__},
 	{"setdefault",  (PyCFunction)dict_setdefault,   METH_VARARGS,
 	 setdefault_doc__},
+	{"pop",         (PyCFunction)dict_pop,          METH_O,
+	 pop__doc__},	
 	{"popitem",	(PyCFunction)dict_popitem,	METH_NOARGS,
 	 popitem__doc__},
 	{"keys",	(PyCFunction)dict_keys,		METH_NOARGS,