所以我有一个Point类,它在这里:
class Point:
def __init__(self,x,y):
self.x = x
self.y = y
def __getitem__(self,index):
self.coords = (self.x, self.y)
if type(index) != str or type(index) != int:
raise IndexError
if index == 'x':
return self.x
elif index == 'y':
return self.y
elif index == 0:
return self.coords[index]
elif index == 1:
return self.coords[index]
如果索引的类型不是str或int,我应该引发IndexError,但由于某种原因,如果我在函数的开头或结尾引发异常,它就不起作用。我应该在哪里提出例外?
答案 0 :(得分:2)
你的问题在于:
if type(index) != str or type(index) != int:
如果它是一个字符串,它不能是一个整数。相反,如果它是一个整数,它就不能是一个字符串。
因此,这些子条件中至少一个将始终为真,因此or
它们将为真。
想想,我有一个水果,我想知道它既不是香蕉也不是苹果。
fruit not banana OR not apple not banana AND not apple
------ ----------------------- ------------------------
apple T or F -> T T and F -> F
banana F or T -> T F and T -> F
orange T or T -> T T and T -> T
您需要:
,而不是使用or
if type(index) != str and type(index) != int:
顺便说一下,除非你需要将coords
存储到其他代码中,否则你可以完全绕过这一点,并使你的代码更清洁:
class Point:
def __init__(self,x,y):
self.x = x
self.y = y
def __getitem__(self,index):
# Check type first.
if type(index) != str and type(index) != int:
raise IndexError
# Return correct value for a correct index.
if index == 'x' or index == 0:
return self.x
if index == 'y' or index == 1:
return self.y
# Index correct type but incorrect value.
raise IndexError
该代码删除了(显然)多余使用coords
,修复了类型检查,"最小化" if
语句是为了清晰起见,并为index
的类型可能正确但其值错误的情况(例如'z'
或42
)。
答案 1 :(得分:0)
您应该像这样编写检查语句:
type(index) != str and type(index) != int:
无论您的索引类型是什么,您当前的支票都是真的!
答案 2 :(得分:0)
您的if
声明错误。尝试
if type(index) not in [str, int]
>>> index = {}
>>> type(index) not in [str, int]
True
>>> index = []
>>> type(index) not in [str, int]
True
>>> index = 0
>>> type(index) not in [str, int]
False
>>> index = '0'
>>> type(index) not in [str, int]
False
>>>