我想要使用一個上下文管理器來控制訪問子目錄,它似乎將它與一個生成器表達式結合起來會非常優雅,但它似乎不起作用。有什麼方法可以糾正這個問題嗎?我可以一起使用這兩種方法嗎?Python上下文管理器可以與生成器一起使用嗎?
這裏的例子:
import os, sys
from contextlib import contextmanager
from glob import glob
@contextmanager
def visitDir(d):
os.chdir(d)
yield d
os.chdir("..")
paths = [os.path.join('.', p[0:-1]) for p in glob('*/')]
def clean():
for p in (visitDir(p) for p in paths): # This is the magic line
print p
print os.getcwd()
clean() # Context manager apparently expires within the generator expression
我用*發生器表達式替換*流* *; *流*不是一個適用於此的概念。 – 2014-12-02 19:12:08
雖然生成器表達式不會創建流,但評估只會在每次獲取新對象時發生,而不是像列表表達式一樣在前面進行評估? – user1677663 2014-12-02 19:47:54
Python將一般概念稱爲迭代器。提示時,迭代器一次產生一個值。生成器表達式是用於以緊湊方式生成生成器的語法,其中生成器是一種專門的迭代器。你*可以*調用結果流,但這不是Python在這個概念的任何地方使用的術語。 – 2014-12-02 20:06:05