2011-02-02 7 views
3

성공시 튜플을 반환하지만 실패하면 None 메서드를 작성하고 있습니다. 아직 None (실패 사례 신고)으로 마감하지 않았지만 선택 사항 중 하나입니다. 우리는 실패 사례에 대해 -1,-1을 반환 할 수 있습니까? 나는 이것을 달성하기위한 최고의 파이썬 방법을 찾고 있습니다. 그래서 쉽게 풀기가 쉽습니다.메서드에서 반환 된 튜플

Google에서 개선 할 수있는 방법을 알려주세요. 의사 코드는 다음과 같습니다.

def myFunc(self): 
    if self.validate() != 0: 
     return 
    x,y = self.getXY() 

    return x,y 
+0

왜? 예외를 제기하는 것이 잘못된 이유는 무엇입니까? –

답변

14

오류가 발생하면 예외를 발생 시키십시오.

물론 (-1, -1)을 실패로 반환 할 수는 있지만 제 생각에는 좋은 해결책이 아닙니다.

파이썬에서 EAFP (용서보다는 용서를 구하는 것이 쉽다)는 LBYL (Look Before You Leap)보다 선호된다는 것을 기억하십시오.

이것은 모든 코드가 작동하고 적절한 예외가 발생한다는 가설에 따라 코드를 작성하는 것이 더 좋습니다.

다음이 될 수 귀하의 코드

def myFunc(self): 
    if self.validate() != 0: 
     raise CustomNotValidatedException() 
    x,y = self.getXY() 

    return x,y 

나는 다음과 같은 방법으로 코드를 개선하는 것입니다 :

  • 메이크업의 self.validate() 반환 0 결과는 매우 긍정적하지 않을 때 당신은 더 파이썬 방법으로 두 번째 행을 변경할 수 있습니다

    if not self.validate(): 
    
  • INT를 제거 에 return 문을 변경하여 x, y 변수를 ermediate :

    return self.getXY() 
    

마지막으로, 당신은 단지 getXY() 내부 예외를 발생시킬 수 있고 코드에서 직접이 방법을 사용합니다.

+2

+1 : 이상한 코드 값을 반환하는 것보다 예외가 더 좋습니다. –

+0

'validate()'내에 예외를 발생시키는 것일까? 아마도? 여기서'getXY()'는 공개 인터페이스의 일부가 아니거나 (모든 이름이 이상한 경우), 실제 코드 대신 게시 용 스텁을 의미한다고 가정합니다. 정말 도우미로 리팩토링되어야합니다 :)). –

+0

아니요, 실제로'getXY()'내에 예외를 던지거나 클라이언트가'getXY()'를 호출하기 전에'validate()'를 강제로 호출해야한다는 것을 의미합니다. 나는 클라이언트에 대해'getXY()'를 호출하는 것이 좋다고 생각한다. 거의 유사 코드에 대해서는이 추론을하기가 어렵다. –

3

프로그래밍 오류를 잡으려면 어설 션이 더 깨끗합니다.

def my_function(self): 
    assert self.validate() 
    return self.x, self.y 

사용자가 제공 한 데이터로 런타임 오류를 잡으려면 예외가 더 좋습니다.

def my_function(self): 
    if not self.validate(): 
     raise ValidationError 
    return self.x, self.y 

여기 좋은 대안은 self.validate에 대한() 유효성 검사 오류 자체를 올리는 것 :이 예를 들어 수 있도록 해주는 메시지를 검증 오류의 원인을 제공 제공 될 수 있습니다.

+0

+1 : 예외는 이상한 코드 값을 반환하는 것보다 낫다. –

관련 문제