f [1]引发异常TypeError:'int'对象不可订阅

时间:2016-10-21 06:05:49

标签: python

def __init__(self,num=0,denom=1):

    self.num = num 
    self.denom = denom 
    if type(self.num)!= int or type(self.denom)!= int:
        raise AssertionError
    if self.denom < 0:
        self.denom = -self.denom 
        self.num = -self.num 
    if self.num == 0:
        self.denom = 1

    from fractions import gcd
    f = gcd(self.denom,self.num)
    int(f)
    if f < 0:
        f = -f
    self.denom = self.denom/f 
    self.num = self.num /f
    self.denom = int(self.denom)
    self.num = int(self.num)



def __repr__(self):
    s = 'Fraction' + str(('('+str(self.num)+','+str(self.denom)+')'))
    return s


def __str__(self):
    s = str(self.num) +'/'+ str(self.denom)
    return s



def __bool__(self):
    if self.num/self.denom == 0:
        return False
    else:
        return True



def __getitem__(self,i):
    if i == 0 or i[0] == 'n':
        return self.num
    if i == 1 or i[0]=='d':
        return self.denom
    else:
        raise TypeError

指令:写一个__getitem__方法,返回参数为0的分子或任何前缀为“numerator”的字符串;返回参数为1的分母或任何前缀为“分母”的字符串。

例如,如果x = Fraction(1,2),则x[0]x[’num’]返回1.
提示:请参阅str.find函数或前缀处理。在其他情况下提高TypeError:例如。 x[2]x[’foo’]

the input is listed as follow:
  43e-->f[1]-->2
  44e-->f['d']-->2
  45e-->f['denom']-->2
  46e-->f['denominator']-->2
  47^-->f[-1]-->TypeError
  48^-->f['x']-->TypeError

the Error I get is: 
  43 *Error: f[1] raised exception TypeError: 'int' object is not subscriptable

有人可以告诉我如何修复__getitem__功能并消除错误?

1 个答案:

答案 0 :(得分:-1)

问题是i==0 or i[0]=='n'

当您使用f[1]时,它会检查i==01==0),但它会给出错误,因此会检查i[0]=='n'1[0]=='n')并收到错误消息。

您可以使用isinstance(variable, type)来检查intstr

if isinstance(i, int):
  if i == 0:
      ...
  elif i == 1:
      ...
  else:
      raise ...
elif isinstance(i, str) and len(i)>0:
  if 'numerator'.startswith(i):
      ...
  elif 'denominator'.startswith(i):
      ...
  else:
      raise ...
else:
  raise ...