在第一次收益之前推进Python生成器功能

时间:2016-04-19 18:19:52

标签: python exception generator

当您实例化生成器函数时,它将不会执行任何代码,直到您在其上调用@Override public void onAttach(Activity activity) { super.onAttach(activity); if (activity instanceof MyInterface) { mMyInterface = (MyInterface) activity; } else { throw new ClassCastException(activity + " must implement interface MyInterface"); } } @Override public void onDetach() { mMyInterface = null; super.onDetach(); }

这意味着如果生成器函数包含某种初始化代码,它将被执行,直到它被迭代。

考虑这个例子:

next

如果文件不存在,则会在for循环中引发异常。我' d 就像在迭代生成器之前执行第一个def generator(filename): with open(filename) as f: data = f.read() while True: yield data gen = generator('/tmp/some_file') # at this point, no generator code is executed # initialization code is executed only at the first iteration for x in gen: pass 之前的代码一样,因此会引发初始化期间的任何异常 在发电机实例化。

有一种干净的pythonic方式吗?

2 个答案:

答案 0 :(得分:5)

在生成器周围包装常规函数并将初始化放在那里:

def file_contents_repeated(filename):
    with open(filename) as f:
        data = f.read()
    return _gen(data)

def _gen(data):
    while True:
        yield data

(在这种情况下,您可以用itertools.repeat替换内部生成器,但一般情况下不能。)

答案 1 :(得分:3)

函数包装器解决方案工作正常。如果要将所有代码保存在同一个函数中,可以创建一个闭包。

def generator(filename):
    with open(filename) as f:
        data = f.read()

    def _generator():
        while True:
            yield data

    return _generator()