[python] 파이썬에서 변수가 없음, 참 또는 거짓인지 어떻게 테스트해야합니까?

세 가지 중 하나를 반환 할 수있는 기능이 있습니다.

  • 성공 ( True)
  • 실패 ( False)
  • 스트림 읽기 / 파싱 오류 ( None)

내 질문은 True또는 False에 대해 테스트하지 않으면 결과가 무엇인지 어떻게 확인 해야하는지입니다. 아래는 내가 현재하고있는 방법입니다.

result = simulate(open("myfile"))
if result == None:
    print "error parsing stream"
elif result == True: # shouldn't do this
    print "result pass"
else:
    print "result fail"

실제로 == True부품 을 제거하는 것보다 간단 합니까 아니면 tri-bool 데이터 유형을 추가해야합니다. simulate외부 프로그램이 오류로 처리하기를 원하면 로그를 기록하고 계속 하기 때문에 함수가 예외를 던지는 것을 원하지 않습니다 .



답변

예외를 두려워하지 마십시오! 프로그램을 로그하고 계속 진행하는 것은 다음과 같이 쉽습니다.

try:
    result = simulate(open("myfile"))
except SimulationException as sim_exc:
    print "error parsing stream", sim_exc
else:
    if result:
        print "result pass"
    else:
        print "result fail"

# execution continues from here, regardless of exception or not

이제 오류 / 오류 없음이 충분히 유익하지 않은 경우를 대비하여 시뮬레이션 방법에서 정확히 무엇이 잘못되었는지에 대해 훨씬 더 풍부한 유형의 알림을받을 수 있습니다.


답변

if result is None:
    print "error parsing stream"
elif result:
    print "result pass"
else:
    print "result fail"

간단하고 명시 적으로 유지하십시오. 물론 사전을 사전 정의 할 수 있습니다.

messages = {None: 'error', True: 'pass', False: 'fail'}
print messages[result]

simulate더 많은 리턴 코드를 포함하도록 함수를 수정하려는 경우이 코드를 유지 보수하는 것이 약간 문제가 될 수 있습니다.

simulate또한, 구문 분석 오류에 예외를 발생시킬 수있는 경우에 당신도 여기를 잡거나 수준을 전파 할 수 및 인쇄 비트가 한 줄 경우-else 문으로 감소 될 것입니다 것입니다.


답변

절대, 절대, 절대 말하지 마

if something == True:

못. if 문에 대한 중복 조건 규칙으로 중복 지정된 것을 반복해서 반복하기 때문에 미친 짓입니다.

더 이상, 여전히, 절대, 절대, 절대 말하지 마십시오

if something == False:

당신은 있습니다 not. 자유롭게 사용하십시오.

마지막으로, a == None비효율적입니다. 마십시오 a is None. None특별한 싱글 톤 객체입니다. 단 하나만있을 수 있습니다. 해당 객체가 있는지 확인하십시오.


답변

나는 상황이 있어도, 그것을 강조하고 싶은 if expr :사람이 있는지 확인하고 싶어하기 때문에 충분하지 않습니다 expr이다 True와에서 단 한 차이가 0/ None무엇이든, / is에서 선호 될 == S. 로트는 피하는 했나요 같은 이유는== None .

그것은 실제로 약간 더 효율적이며, 케이크 위에 체리가 있고, 더 인간이 읽을 수 있습니다.

In [1]: %timeit (1 == 1) == True
38.1 ns ± 0.116 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

In [2]: %timeit (1 == 1) is True
33.7 ns ± 0.141 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)


답변

예외를 던지는 것이 귀하의 상황에 더 좋은 아이디어라고 생각합니다. 대안은 튜플을 반환하는 시뮬레이션 방법입니다. 첫 번째 항목은 상태이고 두 번째 항목은 결과입니다.

result = simulate(open("myfile"))
if not result[0]:
  print "error parsing stream"
else:
  ret= result[1]


답변