Python 嵌套生成函数中的屈服

Python 嵌套生成函数中的屈服,python,Python,我该怎么做才能让它工作 def my_yield(l): try: x = open(l[0], 'r') y = open(l[1], 'w') yield x, y finally: x.close() y.close() def my_wrapper(list): for l in list: return my_yield(l) #<<<

我该怎么做才能让它工作

def my_yield(l):
    try:
        x = open(l[0], 'r')
        y = open(l[1], 'w')
        yield x, y
    finally:
        x.close()
        y.close()




def my_wrapper(list):
    for l in list:
        return my_yield(l)   #<<< what should I put here??


def main():
    list = [('a', 'b'), ('c', 'd')]
    for key, value in my_wrapper(list):
        print key, value
main()
def my_产量(l):
尝试:
x=打开(l[0],'r')
y=打开(l[1],'w')
产量x,y
最后:
x、 关闭()
y、 关闭()
def my_包装(列表):
对于列表中的l:

return my_yield(l)#我认为没有必要使用包装器,在生成器周围,您可以让生成器生成元组并在循环中使用它。另外,不建议使用list作为变量名,因为有一个名为
list
的容器

def gen(mylist):
    for elem in mylist:
        yield (elem[0], elem[1])

def main():
    mylist = [('a', 'b'), ('c', 'd')]
    for key, value in gen(mylist):
        with open(key, 'r') as keyfile:
            with open(value, 'w') as valuefile:
                #do whatever with keyfile and valuefile

main()

您可以在包装器和包装函数中使用
yield
。所以

def my_yield(l):
    try:
        x = open(l[0], 'r')
        y = open(l[1], 'w')
        yield x, y
    finally:
        x.close()
        y.close()

def my_wrapper(the_list):
    for l in the_list:
        yield my_yield(l)
这在很多情况下都很有效。例如,下面是返回列表中每对相邻项的代码:

def create_list():
    for i in range(5):
        yield i

def pair_list():
    generator = create_list()
    first = next(generator)
    for second in generator:
        yield first, second
        first = second
但是,在您的
my_yield
中使用
yield
会让您面临一个非常严重的问题,
yield
语句会导致代码离开
my_yield
函数的控制,只会在
for
循环的下一次迭代中返回,或者调用
next
。这意味着只有在没有异常的情况下才会关闭文件

举例说明:

for x, y in my_yield(('1', '2'))
    raise Exception('BORKED!')

这会导致
x
y
被打开,但永远不会关闭。

好的开始是用
'w'
替换
'w'
为什么您需要在生成器周围安装一个包装器?这里的大图是什么?您想实现什么,为什么您得出结论认为通过包装器函数生成两个打开的文件是一种方法?