引发IndexError

时间:2015-01-28 02:50:29

标签: class exception python-3.x

所以我有一个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,但由于某种原因,如果我在函数的开头或结尾引发异常,它就不起作用。我应该在哪里提出例外?

3 个答案:

答案 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
>>>