2013-02-04 3 views
0

XML 피드에서 추출한 문자열을 포함하는 변수가 있습니다. 문자열 값은 정수, 날짜 또는 문자열 형식 일 수 있습니다. 문자열에서 주어진 데이터 형식으로 변환해야합니다. 나는 이렇게하고있다. 그러나 좀 더 못생긴 것이므로 더 나은 기술이 있는지 묻고있다. 만약 내가 더 많은 타입을 검사한다면, 나는 매우 중첩 된 try - except 블록으로 끝낼 것이다.여러 유형의 문자열 검사

def normalize_availability(self, value): 
    """ 
    Normalize the availability date. 
    """ 
    try: 
     val = int(value) 
    except ValueError: 
     try: 
      val = datetime.datetime.strptime(value, '%Y-%m-%d') 
     except (ValueError, TypeError): 
      # Here could be another try - except block if more types needed 
      val = value 

고마워요!

+0

무엇을이 기능을 반환해야? int, date 또는 str인지 여부를 확인하고 True/False를 반환합니까? – Nitzle

+0

반환 값은 중요하지 않습니다. 여러 번 제외하고 중첩 시도 이외의 다른 방식으로 문자열을 특정 데이터 유형으로 변환하는 더 좋은 해결책이있는 경우가 중요합니다. 4 가지 데이터 유형을 검사한다면 3 단계의 try-except 블록을 갖게됩니다. – Bruce

답변

5

편리한 도우미 기능을 사용하십시오.

def tryconvert(value, default, *types): 
    """Converts value to one of the given types. The first type that succeeds is 
     used, so the types should be specified from most-picky to least-picky (e.g. 
     int before float). The default is returned if all types fail to convert 
     the value. The types needn't actually be types (any callable that takes a 
     single argument and returns a value will work).""" 
    value = value.strip() 
    for t in types: 
     try: 
      return t(value) 
     except (ValueError, TypeError): 
      pass 
    return default 

다음 날짜/시간을 구문 분석 함수를 작성 :

def parsedatetime(value, format="%Y-%m-%d") 
    return datetime.datetime.striptime(value, format) 

이제 함께 '에게 EM을 넣어 :

value = tryconvert(value, None, parsedatetime, int) 
0

올바른 방법은 xml에서 각 유형을 알아야합니다. 이렇게하면 숫자 문자열이 int처럼 끝나는 것을 막을 수 있습니다. 그러나 가정하면 불가능합니다. 나는 날짜를

if value.isdigit(): 
    val = int(value) 

를 선호 INT 유형

, 단지 strptime이 예외를 발생시키는 다음 메시 될 것이다 나는 그것을 분할 및 부품보고 될 생각할 수있는 유일한 방법은, .

+2

나는 이것을'try-except'로 선호하지 않습니다 **. 이것이 실패 할 정수가 많이 있습니다 :'-12 '는 한 가지 예입니다. ''32''은 또 하나입니다. – mgilson

+0

@mgilson 왜 '32'가 나옵니까? 나는 그것이 개종하지 않을 것을 기대할 것이다. 예, 음수가 유효하지 않다고 가정합니다. 그러나 나는 그들이 보통다는 것을 안다. 그렇지 않으면 ... 나쁘다. – cmd

+0

하지만 나는 kindall의 접근 방식을 더 좋아합니다;) – cmd

0
def normalize_availability(value): 
    """ 
    Normalize the availability date. 
    """ 
    val = value 
    try: 
     val = datetime.datetime.strptime(value, '%Y-%m-%d') 
    except (ValueError): 
     if value.strip(" -+").isdigit(): 
      val = int(value) 

    return val