【问题标题】:StopIteration in PythonPython中的停止迭代
【发布时间】:2015-12-15 08:47:18
【问题描述】:

我在阅读函数式编程python时遇到问题。

def get_log_lines(log_file): 
    line = read_line(log_file) 
    while True:
        try:
            if complex_condition(line):
                yield line
            line = read_line(log_file)
        except StopIteration:
            raise

添加了try...except 语句以包围read_line。为什么不让read_line 像这样抛出StopIteration 异常:

def get_log_lines(log_file): 
    line = read_line(log_file) 
    while True:
        if complex_condition(line):
            yield line
        line = read_line(log_file)

【问题讨论】:

  • 确实,try..except 可以安全地删除。这里没有意义。
  • 这里似乎没什么用,但你应该指定 read_line 究竟做了什么,或者当迭代器耗尽时它会如何表现。
  • @dorvak:这是来自免费的 O'Reilly 电子书Functional programming in Python,David 没有分享该书中的实现。更糟糕的是,在不同的示例之间,它会从迭代器切换到类似next() 的函数,这是两种截然不同的实现。

标签: python exception-handling generator stopiteration


【解决方案1】:

我认为没有任何理由将try...except 保留在那里。例如,重新加注仍将带有相同的回溯,因此生成器的行为在那里没有改变。

换句话说,它在那里毫无意义,也许是重构的遗留产物。

您可以进一步简化循环,删除多余的第一行:

def get_log_lines(log_file): 
    while True:
        line = read_line(log_file) 
        if complex_condition(line):
            yield line

【讨论】:

    【解决方案2】:

    作者正在写一个例子。虽然 try...catch 块在这里实际上并没有做任何事情,但他可能包含它以便您可以看到循环是如何被破坏的。

    【讨论】:

      猜你喜欢
      • 2020-08-06
      • 1970-01-01
      • 1970-01-01
      • 2012-08-26
      • 1970-01-01
      • 2017-10-06
      • 2011-09-11
      • 2015-01-20
      • 2011-08-31
      相关资源
      最近更新 更多