KeyError с dict.fromkeys () и dict-like object

В Python вы можете использовать словарь в качестве первого аргумента для dict.fromkeys() , например:

 In [1]: d = {'a': 1, 'b': 2} In [2]: dict.fromkeys(d) Out[2]: {'a': None, 'b': None} 

Я попытался сделать то же самое с диктоподобным объектом, но это всегда вызывает KeyError , например:

 In [1]: class SemiDict: ...: def __init__(self): ...: self.d = {} ...: ...: def __getitem__(self, key): ...: return self.d[key] ...: ...: def __setitem__(self, key, value): ...: self.d[key] = value ...: ...: In [2]: sd = SemiDict() In [3]: sd['a'] = 1 In [4]: dict.fromkeys(sd) --------------------------------------------------------------------------- KeyError Traceback (most recent call last) C:\bin\Console2\<ipython console> in <module>() C:\bin\Console2\<ipython console> in __getitem__(self, key) KeyError: 0 

Что именно здесь происходит? И можно ли это решить, кроме использования чего-то вроде dict.fromkeys(sd.d) ?

Чтобы создать dict, fromkeys его аргумент. Так что это должен быть итератор. Один из способов заставить его работать – добавить метод __iter__ к вашему dict like:

 def __iter__(self): return iter(self.d) 

экземпляр SemiDict не является последовательностью. Я бы предположил, что наиболее очевидным решением было бы унаследовать от dict , почему бы вам не сделать это?