iter()返回类型为“ dict_items”的非迭代器

时间:2018-09-29 03:42:29

标签: python python-3.x class

这让我发疯。下面是我正在玩的class,目标是要有一种方法来支持动态属性分配。 请暂时忘记执行不力或为什么我不只是使用字典,我知道还有其他方法可以做到这一点(例如Enum),但这是我的测试代码以前和现在,我一直在寻找为什么它不起作用。

class Family(object):
    def children(self):
        return self.__dict__.values()

    def __setitem__(self, key, value):
        self.__dict__[key] = value

    def __getitem__(self, item):
        return self.__dict__[item]

    def __repr__(self):
        return str(self.__dict__)

    def __iter__(self):
        return self.__dict__.items()

一切似乎都很好,我按如下所示启动了一个测试对象:

foo = Family()
foo.a = 'foo'
foo.b = 'bar'

[i for i in foo]

现在预期的结果是[('a', 'foo'), ('b', 'bar')],但是我得到的却是:

  

TypeError: iter() returned non-iterator of type 'dict_items'

我认为我可能搞砸了__iter__方法,因此我进行了如下检查:

type(foo.__iter__())
# <class 'dict_items'>
type(foo.__dict__.items())
# <class 'dict_items'>

[i for i in foo.__dict.__items()]
# [('a', 'foo'), ('b', 'bar')]

foo.__dict__.items() == foo.__iter__()
# True

如果它们都相同,为什么[i for i in foo]不起作用?

1 个答案:

答案 0 :(得分:3)

那呢:

def __iter__(self):
    return iter(self.__dict__.items())

Python需要一个iterator,而不是list(或其他类似列表/类似字典的对象)

请记住:listdict不是iteratoriterator通常是(为了易于理解)指向以下项的指针(光标) listdict