diff -r 55c951167cd9 Lib/test/test_dict.py --- a/Lib/test/test_dict.py Mon Apr 23 23:56:36 2012 +0800 +++ b/Lib/test/test_dict.py Mon Apr 23 18:17:22 2012 +0100 @@ -879,6 +879,16 @@ values = list(it) + [drop] self.assertEqual(sorted(values), sorted(list(data.values()))) + def test_instance_dict_getattr_str_subclass(self): + class Foo: + def __init__(self, msg): + self.msg = msg + f = Foo('123') + class _str(str): + pass + self.assertEqual(f.msg, getattr(f, _str('msg'))) + self.assertEqual(f.msg, f.__dict__[_str('msg')]) + from test import mapping_tests class GeneralMappingTests(mapping_tests.BasicTestMappingProtocol): diff -r 55c951167cd9 Objects/dictobject.c --- a/Objects/dictobject.c Mon Apr 23 23:56:36 2012 +0800 +++ b/Objects/dictobject.c Mon Apr 23 18:17:22 2012 +0100 @@ -641,7 +641,11 @@ register PyDictKeyEntry *ep; if (!PyUnicode_CheckExact(key)) { - return lookdict(mp, key, hash, value_addr); + ep = lookdict(mp, key, hash, value_addr); + /* lookdict expects a combined-table, so fix value_addr */ + i = ep - ep0; + *value_addr = &mp->ma_values[i]; + return ep; } i = (size_t)hash & mask; ep = &ep0[i];