从__iter__返回一个非迭代器

发布于 2021-01-29 16:12:49

class test(object):
    def __init__(self):
        pass
    def __iter__(self):
        return "my string"

o = test()
print iter(o)

为什么这会提供追溯?

$ python iter_implement.py
Traceback (most recent call last):
  File "iter_implement.py", line 9, in <module>
    print iter(o)
TypeError: iter() returned non-iterator of type 'str'

我希望__iter__在这种情况下只返回字符串。什么时候以及为什么检测到返回的对象不是迭代器对象?

关注者
0
被浏览
52
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    可以通过添加 iter() 调用来修复代码:

    class test(object):
        def __init__(self):
            pass
        def __iter__(self):
            return iter("my string")
    

    这是一个示例运行:

    >>> o = test()
    >>> iter(o)
    <iterator object at 0x106bfa490>
    >>> list(o)
    ['m', 'y', ' ', 's', 't', 'r', 'i', 'n', 'g']
    

    原始错误的原因是 iter 的API声称要返回实际的迭代器。在 国际热核实验堆() 函数检查,以确保履行合同。

    注意,这种错误检查也发生在其他地方。例如, len() 函数检查以确保 len () 方法返回整数:

    >>> class A:
            def __len__(self):
                return 'hello'
    
    >>> len(A())
    Traceback (most recent call last):
      File "<pyshell#4>", line 1, in <module>
        len(A())
    TypeError: 'str' object cannot be interpreted as an integer
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看