2017-09-29 1 views
1

저는이 유형의 코드 로직을 처리하기 위해 파이썬에서 최선의 방법/숙어 방법이 무엇인지 질문하고 싶습니다. apply_function()에 확인해야 할 10 개 이상의 기능이있는 경우일련의 함수 검사를 처리하기 위해 파이썬에서 가장 좋은/숙어 방법은 무엇입니까

list_a = [] 

def func_a(): 
    if some check not pass 
    return False 

    # check pass 
    add some stuff to list_a and return True 

def func_b(): 
    if some check not pass 
    return False 

    # check pass 
    add some stuff to list_a and return True 

def func_c(): 
    if some check not pass 
    return False 

    # check pass 
    add some stuff to list_a and return True 

def apply_function(): 
    if fun_a(): 
    return list_a 
    if fun_b(): 
    return list_a 
    if fun_c(): 
    return list_a 
    ... 

    return list_a #empty list 

, 처리하는 더 좋은 방법은 무엇입니까?

이 어쩌면 any()이 상황에서 사용 될 수 있는가 나

If funcA() or funcB() or funcC(): 
    return list_a 

return list_a 

작동?

감사합니다.

+0

외부 범위 밖의 목록이기 때문에 'list_a'에 항목을 추가하는 것이 더 문제가됩니다. 이것은 상태의 개념을 도입합니다. –

답변

2

글로벌을 변경하지 마십시오. 귀하의 기능이 이면 응답이이거나 실패한 경우 예외가 발생합니다. 그런 식으로 함수의 결과를 반환하거나 예외가 발생하면 다음으로 계속 진행할 수 있습니다.

def func_a(): 
    if some check not pass 
     raise ValueError('....') 

    # check pass 
    return [some, list] 

# further functions that apply the same pattern. 

def apply_function(): 
    for f in (func_a, func_b, func_c): 
     try: 
      return f() 
     except ValueError: 
      # check didn't pass, continue on to the next 
      pass 

예외는 검사가 실패했다는 신호로 여기에 이상적인 방법입니다,이 함수는 조건이 너무 충족되지 않은 할 수 있기 때문에 결과를 반환 할 수없는 호출을 말하고있다. 예외가 발생하지 않으면 반환 값이 올바른지 신뢰할 수 있습니다.

함수는 객체 일 뿐이므로 함수 이름을 시퀀스에 넣고 반복 할 수 있습니다. 일부 레지스터를 사용하여 더 많은 기능을 추가하여 전역 목록을 시도 할 수도 있습니다.

+0

감사합니다. 이 프로그램은 원래 모든 경우에 대해 포괄적이었으며 func_b는 func_a보다 더 느슨한 지 확인하고 다른 경우를 확인합니다. –

관련 문제