代码之家  ›  专栏  ›  技术社区  ›  r.ook jpp

iter()返回“dict\u items”类型的非迭代器

  •  2
  • r.ook jpp  · 技术社区  · 6 年前

    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 回复  |  直到 6 年前
        1
  •  9
  •   shawn    6 年前

    这个呢:

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

    iterator ,不是 list

    记住:a dict 不是一个 ,安 迭代器 通常是(为了容易理解)一个指针(光标)指向 列表 口述