当您实例化生成器函数时,它将不会执行任何代码,直到您在其上调用@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方式吗?
答案 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()