2016-08-18 3 views
1

컨트롤 플로우, 콜백 또는 예외를위한 파이썬은 무엇입니까?파이썬 콜백과 컨트롤 플로우의 예외 비교

try: 
     valid_data = validate(form) 
     try:   
      do_login(valid_data)   
      return SuccessLoginTemplate() 
     except LoginError: 
      return RenderTemplate(form) 
    except FormError: 
     return RenderTemplate(form) 

콜백을

예외 : 나는 사용자 로그인 논리를 쓴 예를 들어 것은 나는이 방법을 쓸 수

validate(form, on_form_ok, on_form_error) 

def on_form_ok(valid_data): 
    do_login(valid_data, on_login_success, on_login_error) 


def on_form_error(errors): 
    return RenderTemplate(form) 

def on_login_success(user): 
    return SuccessLoginTemplate() 

def on_login_error(errors): 
    return RenderTemplate(form) 

대부분의 파이썬 코드가 예외를 통해 한 경우 writen 것 같다 , IMO 콜백 스타일은 DSL 뷰 시점에서 더욱 표현력이 있습니다. 콜백의 경우 중간 코드는 콜백 간다 beacause를 중간 바르와

try: 
    valid_data = validate(form) 
    try: 
     #mess with some intermediate vars 
     do_login(valid_data) 
     #mess with some intermediate vars 
     return SuccessLoginTemplate() 
    except LoginError: 
     #mess with some intermediate vars 
     return RenderTemplate(form) 
except FormError: 
    #mess with some intermediate vars 
    return RenderTemplate(form) 

IMO이 혼란은, 코드의 가독성을 줄일 : 내 말 "또 다른 하나 개의 통화에서 바르 preapere하는 단서"더 중간 코드없는 경우 2 년 그리고 그것을 이해하기 더 쉽게 함수에서 wraped, 그래서 그것에 일부 컨텍스트를 가져옵니다 (나는 일부 DSL 의미를 지닌 함수 이름을 의미한다.) 예외의 경우이 코드는 어떤 컨텍스트에서도 언 바인딩되므로

또한 함수의 결과를 확인하고 싶지 않습니다. 이것은 또한 중간 중간 변수를 혼란스럽게 만듭니다. 모나드 또는 CPS 스타일과 같은보다 기능적인 스타일로 함께 계산을 연결하는 가장 확실한 방법을 찾습니다. 따라서 IMO 콜백은보다 expresive 한 방법이지만, 파이썬이되는 방법은 무엇입니까? 명시 적으로 조작하고 (이 같은 문서 또는 아무것도 쓰지 않는) 콜백 당신이 알고하지 않는 동안 전달 된 모든 변수와 물건 1 try 2 개 별개의 except의 표현 적어도 :

+0

''try '를 2 회 쓸 필요는 없습니다 : 1'try' 2'except's. – sepulchered

+0

'do_login()'메소드가 로그인이 성공했는지 여부를 알려주는'boolean '을 반환하도록 할 수 있습니다. – Rittel

+0

예외 계산에 집중하지 마십시오. 질문은 더 많은 pythonic 제어 흐름에 관한 것이 었습니다. – Evg

답변

0

IMO, 당신은 3 명백한 상황이 건네주는 콜백의 인수는 무엇입니까? 예외 이름을 가진 예외 블록은 코드 블록에 충분한 의미를 부여합니다. 그리고 당신도 오직 검증을하지 (콜백)

def validate(data, on_success, on_error1, on_error2): 
    try: 
     # do_validation_stuff here 
    except Exception1: 
     on_error1() 
    except Exception2: 
     on_error2() 
    else: 
     on_success() 

따라서 validate 기능을이 같은 validate을 구현해야하지만, 오류 처리를 취급하고 예에서 사용자 로그인을한다.

+0

깨끗하게하기 위해 나는 validate하기를 원하지 않는다. "당신은 (당신이 문서 또는 이와 비슷한 것을 쓰지 않는다면) 적어도 전달할 콜백에 대한 인수가 무엇인지 알지 못합니다."그리고 왜 콜백이 왔는지 알고 있어야합니까? – Evg

+0

@Evg 예에서'validate' 함수에 전달 된 콜백으로 로그인합니다. 따라서 콜백을 실행하면 결국'validate (on_success, on_error) '를 작성하여 로그인을 실행합니다. 제가 잘못 했습니까? – sepulchered