Python에서 부드럽게 연결된 이터레이터 및 리소스 관리를 명확하게 표현하기가 어렵습니다.pythonic way : 반복자 체인 및 리소스 관리
아마 구체적인 예를 검사하여 명확하게됩니다
나는 유사하면서도 다른 CSV 파일의 무리에 작동이 작은 프로그램이 있습니다. 다른 동료들과 공유되기 때문에 자주 열고 닫아야합니다. 또한, 나는 그들의 콘텐츠를 변환하고 필터링해야합니다. 내가 말했듯이, 나는 그 많은을 가지고 내가했던 것보다 더 많은 복사 붙여 넣기 결국, 좋은 읽을 수있어def doSomething(fpath):
with open(fpath) as fh:
r=csv.reader(fh, delimiter=';')
s=imap(lambda row: fn(row), r)
t=ifilter(lambda row: test(row), s)
for row in t:
doTheThing(row)
:하지만, 그래서 나는 이런 종류의 다른 fonctions을 많이 가지고 소원. 그러나 물론 나는 반복자를 반환하는 함수에 공통 코드를 리팩토링 할 수 없습니다
def iteratorOver(fpath):
with open(fpath) as fh:
r=csv.reader(fh, delimiter=';')
return r #oops! fh is closed by the time I use it
코드를 리팩토링하기위한 첫 번째 단계는 다른 '활성화 된 -'클래스를 생성하는 것입니다 :
def openCsv(fpath):
class CsvManager(object):
def __init__(self, fpath):
self.fh=open(fpath)
def __enter__(self):
return csv.reader(self.fh, delimiter=';')
def __exit__(self, type, value, traceback):
self.fh.close()
을
다음 :
with openCsv('a_path') as r:
s=imap(lambda row: fn(row), r)
t=ifilter(lambda row: test(row), s)
for row in t:
doTheThing(row)
하지만 단지 하나의 단계에서 각 기능의 상용구를 감소시켰다.
그런 코드를 리팩토링하는 파이썬 방법은 무엇입니까? 내 C++ 배경이 내가 생각하는 방식대로되고있다.
동정 파이썬 3 사용할 수 있습니다 ...하지만 어쨌든, 당신은 그'imap' &'의 IFilter를 향상시킬 수 있습니다 '전화. 그 람다들을 제거하십시오! 대신에,'imap (fn, r)'과'ifilter (test, s)'를해라. –