2013-07-17 2 views
0

사용자에게 몇 가지 값을 입력하도록 요청하는 GUI가 있습니다. 사용자가 각각의 입력 값을 입력 한 경우, I는 사용자 입력이 존재하고 정수로 구성되어 있는지 확인하는 더 파이썬적인 방법

  • 다음 I는 입력 된 각각의 값은 정수
  • 경우에 체크 제

    1. : 사용자 데이터를 전송하면 좀 검증 할 많은 것을 반복하지 않으려 고 노력했지만, 검증의 두 번째 부분은 해킹과 비슷해 보입니다. 유효성 검사의 첫 번째 부분에서와 같이 모든 것을 철자로 작성하는 것이 부족한이 구형을 재 작성하는 더 평범한 방법이 있습니까? 입력이 포함되어있는 경우

      if self.start.GetValue().strip().isdigit(): 
          pass 
      

      isdigit() 반환 입력이 빈 문자열 두 경우 모두에 대한 False, 그리고 :

      errors = [] 
          # 1) check if values exist 
          if not self.startInput.GetValue(): 
           errors.append("Please provide a start") 
          if not self.stopInput.GetValue(): 
           errors.append("Please provide a stop") 
          if not self.valueInput.GetValue(): 
           errors.append("Please provide a value") 
          # 2) check if values are integers 
          try: 
           self.start = int(self.startInput.GetValue()) 
           self.stop = int(self.stopInput.GetValue()) 
           self.value = int(self.valueInput.GetValue()) 
          except ValueError as err: 
           tb = traceback.format_exc() 
           func = re.search('self\.(.*) =', tb).groups()[0] 
           errors.append("Value for {0} needs to be an integer.".format(func)) 
          if errors: 
           raise RuntimeError('\n'.join(errors)) 
      

    답변

    4

    당신이 정수를 확인하고 있기 때문에, 그리고 수레, 당신은 간단하게 할 수있는 비 숫자.

    당신이 잘못 지정을 위해 특정 오류를 보내려면

    :

    startValue = self.start.GetValue().strip() 
    
    if not startValue: 
        errors.append("Please provide a start.") 
    
    if not startValue.isdigit(): 
        errors.append("Value of start must be an integer.") 
    
    +0

    이것은 좋은 옵션처럼 보이지만 데이터가 누락되어 있는지 ("시작 값을 입력하십시오") 대 데이터가 존재하지만 정수가 아닌지에 따라 다른 오류 메시지를 표시하는 방법이 없습니다 (" 시작 값은 정수 여야합니다 "). 옳은? – BioGeek

    +0

    @BioGeek : 사실, 만약 당신이 그 기능을 원한다면, 나는 두 개의'if' 문 또는'try ... except' 문으로 갈 것입니다. 어느 것이 든 완벽하게 파이썬 적입니다. –

    +0

    @BioGeek 제 편집을보세요. –

    1

    은 내가 try: ... except 완벽 파이썬 생각합니다. 당신이라는 사전에 이러한 입력이있는 경우

    def get_int_of_name(name, value, error): 
        try: 
         res = int(value) 
        except ValueError: 
         error.append("...") 
         return 0 
        else: 
         return res 
    
    +1

    필자는'try ... except'는 아름답게 명시 적이며 따라서 pythonic이라는 것에 동의합니다. 그러나 알몸 예외를 포착하지 않아야합니다. 'except :'대신'ValueError :'를 제외하고 할 것입니다. –

    +0

    @Joel : "ValueError"가있을 때 역 추적을 정규식으로 구문 분석하는 것이 더 이상 없습니다. – BioGeek

    +1

    @Joel Cornett : 물론 이죠! 나는 여기에 넣고 싶었던 예외를 체크하고 있었고, 올바른 것을 넣는 것을 잊어 버렸다. 나는 그것을 지금 고쳤다. – hivert

    1

    inputs 당신이 할 수 있습니다 :

    errors = [] 
    for inputname, inputval in self.inputs.items(): 
        if not inputval: 
         errors.append("Please provide a {}".format(inputname)) 
        try: 
         setattr(self, inputname, int(inputval.GetValue())) 
        except: 
         errors.append("Value for {0} needs to be an integer.".format(inputname)) 
    if errors: 
        raise RuntimeError('\n'.join(errors)) 
    
    나는 것 필요한 경우를 int 및 업데이트 오류를 ​​반환하는 대신 오류 메시지 get_int_of_name(name, value, error)를 통해 검색의 도우미 함수를 사용
    +1

    오류 목록에 형식이 잘못된 _all_ 값을 포함하는 경우 첫 번째 오류가 아닌 +1 – Henrik

    관련 문제