Python의 with 문에 관한 두 가지 질문이 있습니다. 그들은 실생활 문제에서 비롯된 것이므로 그것을 계속 간직하고 있습니다. 파이프의 흐름을 제어하기 위해 핀치 밸브를 다루고 있습니다. 내가 문으로가 (파일이 마지막에 또는 오류 경우 폐쇄 된 파일을 수행 정확히 무엇을 필요로 일부 작업의 경우Python에서 with 문 사용에 대한 팁
class Valve(object):
"""This class drives a pinch valve."""
def __init__(self):
self.close()
def open(self):
print('Open the valve.')
self.state = 'opened'
def close(self):
print('Close the valve.')
self.state = 'closed'
def print_state(self):
print('The valve is '+self.state+'.')
을 :
이 프로그램은 클래스가 그렇게 찾고 밸브를 구동
def opened(self):
return ContextManagerOpenedValve(self)
class ContextManagerOpenedValve(object):
def __init__(self, valve):
self.valve = valve
def __enter__(self):
self.valve.open()
return self.valve
def __exit__(self, type, value, traceback):
self.valve.close()
그런 다음이 라인은 내가 예상대로 작동하는 것 :)가 발생, 그래서 클래스 밸브 및 다른 클래스에 기능을 추가
def do_something():
print('For the sake of simplicity, this function does nothing.')
valve = Valve()
valve.print_state()
with valve.opened():
valve.print_state()
do_something()
valve.print_state()
첫 번째 질문 : 그런 결과를 얻는 올바른 방법은 무엇입니까? 그걸로 with 문을 사용할 권리가 있습니까? ContextManagerOpenedValve 클래스를 정의하지 않고 똑똑한 방법으로이를 수행 할 수 있습니까?
은 그 때 나는 같은 것을 할 필요가 : USE_VALVE = 거짓 # 또는 USE_VALVE = 사실 내가 함수 do_something부터이 솔루션을 싫어하는
if USE_VALVE:
with valve.opened():
do_something()
else:
do_something()
어쨌든 실행은 반복을 피하기 위해 훨씬 더 좋은 것, 그래서 "do_something()"중 하나입니다.
두 번째 질문 : do_something()을 두 번 반복하지 않고 동일한 결과를 얻는 방법이 있습니까?
게시물 당 하나에 질문을 보관하십시오; 예를 들어, 조건부 컨텍스트 관리자 부분은 복제본입니다. –