2014-04-01 2 views
1

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()을 두 번 반복하지 않고 동일한 결과를 얻는 방법이 있습니까?

+1

게시물 당 하나에 질문을 보관하십시오; 예를 들어, 조건부 컨텍스트 관리자 부분은 복제본입니다. –

답변

0

물론, 당신과 같이 그것을 할 수처럼

def valve_control(valve, use_value=False): 
    if use_value: 
    return ContextManagerOpenedValve(valve) 
    else: 
    return SomeFakeContextManager() 

그런 다음 호출은 같습니다

with valve_control(value, USE_VALVE): 
    do_something()