2017-02-21 107 views
0

這是我的代碼。修復類型錯誤:類型'...'的對象沒有len

def areSimilar(item1,item2): 
    if(len(item1) == len(item2)): 
     for i in range(len(item1)): 
      if isinstance(item1[i],list) and isinstance(item2[i],list): 
       if areSimilar(item1[i],item2[i])==False: 
        return False 

      else: 
       if type(item1[i]) != type(item2[i]): 
        return False 

    else: 
     return False 
    return True 

下面是一些想要工作的例子。

>>> print(areSimilar(True, False)) #items are same type and are not lists 
True 
>>> print(areSimilar(1, 'a') #items are different types 
False 
>>> print(areSimilar([],[]))      
True       
>>> print(areSimilar([],[3])) #list lengths differ 
False 
>>> print(areSimilar([3.0],[3])) #lists of same length but index 0 items are not similar 
False 
>>> print(areSimilar([5],[3])) #lists of same length and corresponding lists items are similar 
True 
>>> print(areSimilar([1,2,['a','b']],[3,4, [1,2,3]])) #items at index 2 are not similar 
False 
>>> print(areSimilar([1,2,[False, 'b']],[3, 4, [True, 'hello']])) 
True 
>>> print(areSimilar([[[[],[2],[],['hi', [0]]]]], [[[[],[-2],[],['bye', [1]]]]])) 
True 
>>> print(areSimilar([[[[],[2],[],['hi', [0]]]]], [[[[],[-2],[],['bye', 0]]]])) 
False 

他們都工作,除了前兩個。我在哪裏得到

"TypeError: object of type 'bool/int' has no len"

我該如何解決這個問題?

+1

改變你的控制流來處理沒有'ob_size'或實現'__len__'的東西嗎? – miradulo

+0

顯然int或bool沒有長度的概念。所以你的函數不應該試圖在參數上調用'len',直到確定傳入的東西是有效的東西來調用'len'爲止。 –

+1

或者在出現問題時使用try/except塊來處理問題 –

回答

0

只需添加將轉換類型爲列表的警衛。

def areSimilar(item1,item2): 
    if not getattr(item1, '__len__', False): 
     item1 = [item1] 
    if not getattr(item2, '__len__', False): 
     item2 = [item2] 
    if(len(item1) == len(item2)): 
     for i in range(len(item1)): 
      if isinstance(item1[i],list) and isinstance(item2[i],list): 
       if areSimilar(item1[i],item2[i])==False: 
        return False 

      else: 
       if type(item1[i]) != type(item2[i]): 
        return False 

    else: 
     return False 
    return True 

但是解決方案看起來很混亂,整體功能設計需要改變。

相關問題