이것에 대한 당신의 직감은 정확합니다.이를 수행하는 더 좋은 방법이 있습니다 : monads .
Monads 란 무엇입니까?
모나드는 연결 메커니즘을 숨기면서 (위키 백과를 역설하기 위해) 서로 연결하는 방법입니다. 귀하의 경우 연결 메커니즘은 중첩 if
입니다. 그것을 숨기면 코드가 훨씬 멋지게 나옵니다.
그냥 그렇게 할 두 개의 모나드 ( "Maybe"와 "Either")가 있으며 운 이 좋은 파이썬 모나드 라이브러리의 일부입니다 !
그들이 당신의 코드를 위해 할 수있는 것
다음은 "Either"모나드 (연결된 라이브러리의 "Failable")를 사용하는 예입니다. 여기서 함수는 발생한 상황에 따라 성공 또는 실패를 반환 할 수 있습니다.
import os
class DoSomething(object):
def remove_file(self, filename):
try:
os.remove(filename)
return Success(None)
except OSError:
return Failure("There was an OS Error.")
@do(Failable)
def process_file(self, filename):
do_something()
yield remove_file(filename)
do_something_else()
mreturn(Success("All ok."))
이제는 현재와 크게 다르지 않지만 더 많은 작업을 수행하여 오류가 발생할 수있는 상황은 다음과 같습니다.
def action_that_might_fail_and_returns_something(self):
# get some random value between 0 and 1 here
if value < 0.5:
return Success(value)
else:
return Failure("Bad value! Bad! Go to your room!")
@do(Failable)
def process_file(self, filename):
do_something()
yield remove_file(filename)
yield action_that_might_fail(somearg)
yield another_action_that_might_fail(someotherarg)
some_val = yield action_that_might_fail_and_returns_something()
yield something_that_used_the_return_value(some_val)
do_something_else()
mreturn(Success("All ok."))
함수 yield
의 각 s에서 process_file
함수 호출이 실패를 리턴하면 해당 시점에서process_file
함수가 종료되고 나머지 부분을 계속 진행하는 대신 실패한 함수에서 실패 값을 리턴합니다.Success("All ok.")
이제 중첩 된 if
s로 위를 수행한다고 상상해보십시오 ! (반환 값을 어떻게 처리하겠습니까!?)
결론
모나드는 좋다 :)
노트:
저는 파이썬 프로그래머가 아닙니다. 프로젝트 자동화를 위해 닌자 스크립트로 위의 링크 된 모나드 라이브러리를 사용했습니다. 그러나 일반적으로 선호되는 관용적 접근법은 예외를 사용하는 것입니다.
IIRC는 ATM의 위치를 잊었지만 링크 된 페이지의 lib 스크립트에 오타가 있습니다. 기억이 나면 업데이트하겠습니다. 내 페이지와 페이지를 비교하여 다음을 발견했습니다 def failable_monad_examle():
.-> def failable_monad_example():
- p
에서 example
누락되었습니다.
(같은 Failable 장식 된 함수의 결과를 얻기 위하여 process_file
당신이에 결과를 캡처 할 수있다) variable
과을 variable.value
그것을 얻을 수 있습니다.