diff -r 44f455e6163d Lib/argparse.py --- a/Lib/argparse.py Thu Jun 27 12:23:29 2013 +0200 +++ b/Lib/argparse.py Sat Jul 12 14:47:38 2014 -0700 @@ -1263,7 +1263,11 @@ registry[value] = object def _registry_get(self, registry_name, value, default=None): - return self._registries[registry_name].get(value, default) + try: + return self._registries[registry_name].get(value, default) + except TypeError: + # probably TypeError: unhashable type: 'dict', e.g. {}.get + return default # ================================== # Namespace default accessor methods diff -r 44f455e6163d Lib/test/test_argparse.py --- a/Lib/test/test_argparse.py Thu Jun 27 12:23:29 2013 +0200 +++ b/Lib/test/test_argparse.py Sat Jul 12 14:47:38 2014 -0700 @@ -4672,6 +4672,30 @@ args = parser.parse_args([]) self.assertEqual(args.test, []) +# ======================= +# unhashable type tests +# ======================= + +class TestUnhasableTypeError(TestCase): + + @unittest.skip('corrected with _registry_get change') + def test_unhashable_type_error(self): + "error with original code" + dd = dict(one=1, two=20, three=300) + parser = ErrorRaisingArgumentParser(prog='PROG', add_help=False) + with self.assertRaises(TypeError) as cm: + parser.add_argument('x', type=dd.get) + msg = str(cm.exception) + self.assertRegex(msg, 'unhashable type') + + def test_unhashable_type_noerror(self): + "_registry_get handles unhashable TypeError" + dd = dict(one=1, two=20, three=300) + parser = ErrorRaisingArgumentParser(prog='PROG', add_help=False) + parser.add_argument('x', type=dd.get) + args = parser.parse_args('two'.split()) + self.assertEqual(NS(x=20), args) + # ====================== # parse_known_args tests # ======================