修复类型错误:类型'...'的对象没有len
问题描述:
这是我的代码。修复类型错误:类型'...'的对象没有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"
我该如何解决这个问题?
答
只需添加将转换类型为列表的警卫。
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
但是解决方案看起来很混乱,整体功能设计需要改变。
改变你的控制流来处理没有'ob_size'或实现'__len__'的东西吗? – miradulo
显然int或bool没有长度的概念。所以你的函数不应该试图在参数上调用'len',直到确定传入的东西是有效的东西来调用'len'为止。 –
或者在出现问题时使用try/except块来处理问题 –