2013-02-04 80 views
0

我有一個包含字符串(從XML提要中提取)的變量。字符串值可以是整數,日期或字符串類型。我需要將它從字符串轉換爲給定的數據類型。我這樣做,但它有點難看,所以我問是否有更好的技術。如果我想檢查更多類型,我會以非常嵌套的嘗試結束 - 除了塊。字符串檢查多種類型

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,日期或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) 

現在放你的歌一起:

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

正確的方法是從xml知道每個應該是什麼類型。這將防止發生數字字符串的事情以int結尾,等等。但假設這是不可能的。

對於int類型,我更喜歡

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

的日期,唯一的辦法,我能想到會被拆分,並在看的部分,這將是梅西耶然後只是讓strptime引發異常。

+2

我絕對不會**更喜歡'嘗試 - 除外'。有很多整數,這會失敗:''-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