2014-03-26 96 views
2

我想從包含關於歌曲的元數據的JSON對象中提取幾個元素,使用Python。爲了測試信息是否可用,我爲每個元數據元素使用try語句。另外,對於稍後在我的程序中需要做的一些字符串處理,我將每個值保存在一個不同的變量中。如何提高在Python中重複使用try語句?

有關如何改進以下代碼以便爲每個不同的元數據值創建try/except語句的任何建議?

if len(r['response']['songs']) is not 0: 
    # Request information about the artist 
    artist_desc_string = "http://developer.echonest.com/api/v4/artist/terms?api_key="+api_key+\ 
         "&name="+artist+"&format=json" 
    r2 = requests.get(artist_desc_string).json() 

    # Extract information from the song JSON 
    try: 
     title = r['response']['songs'][0]['title'] 
    except (IndexError, KeyError): 
     title = "NULL" 

    try: 
     artist_name = r['response']['songs'][0]['artist_name'] 
    except (IndexError, KeyError): 
     artist_name = "NULL" 

    try: 
     artist_location = r['response']['songs'][0]['artist_location']['location'].replace(',','*') 
    except (IndexError, KeyError): 
     artist_location = "NULL" 

    try: 
    ... 
    ... 
+0

這個問題似乎是題外話,因爲它屬於上http://codereview.stackexchange.com – jonrsharpe

+1

如果你只是希望在處理KeyError異常最後一個元素,你可以看看'dict.get',但是因爲你正沿着查找路徑的整個長度捕捉任何東西,所以不是真的。你也許可以把路徑放在一個列表中,並循環它們,但這只是可以更簡潔,可能更慢。 –

+2

只是一個觀察:你總是可以將'r ['response'] ['songs'] [0]'賦值給一個變量,看看它是如何反覆使用的。 – Manhattan

回答

3

也許這可以幫助:

def get_value(d, keys): 
    try: 
     if keys: 
      for i in range(len(keys)): 
       key = keys[i] 
       return get_value(d[key], keys[i+1:]) 
     return d 
    except (IndexError, KeyError): 
     return "Null" 


>>> d = {'person': {'name': {'first': 'aamir'}}} 
>>> get_value(d, ['person', 'name', 'first']) 
aamir 
+0

笑很呈三角我的答案(除更可讀):) +1 –

+0

@JoranBeasley我只注意到它:P我在寫我自己解。 –

+0

Upvoted你們兩個..沒有真正期望從OP問什麼更深的屬性,但我喜歡你的解決方案。 –

1

與所有可能的屬性循環使用......

attribs = {'title': None, 'artist_name':None, 'location': None, 'etc': None} for key in attribs: try: attribs[key] = r['response']['songs'][0][key] except (IndexError, KeyError): attribs[key] = "NULL"

這樣,你只需要管理字典attribs ...

至於抓意外的屬性,你總是可以得到JSON對象的鍵並在屬性中創建更多的條目

+1

這不能處理'r ['response'] ['songs'] [0] ['artist_location'] ['location']'類似的東西嗎? –

3

這樣的事情也許?

def get_or_dont(d,list_of_keys): 
    d2 = d 
    while list_of_keys: 
     try: 
      d2 = d2[list_of_keys.pop(0)] 
      if not list_of_keys: return d2 
     except: 
      break 
    return "Null" 

r = {'response':{ 
'a':5, 
'b':{'6':{'5':3}}, 
'c':[1,2,3] 
}} 
print get_or_dont(r['response'],["b","6"]) 
+0

bare' except'?皺眉的臉。 – roippi

+0

例外的名單很長...基本上任何異常應返回一個「空」 –