PYTHON:TypeError:'NoneType'对象没有TESTCASE的属性'__getitem__'

时间:2019-02-21 20:14:52

标签: python error-handling testcase

我不明白为什么会收到此错误,因为当我将“ height”传递为-1时,它必须将“ error”更改为“ Height must be .GE to zero” 并且该测试用例通过了。

但是,当我测试基本案例0时,它说列表中没有内容?有人可以解释为什么吗?或告诉我我的代码有什么问题

def adjust(values):
      #default
      height = 0

      if ('height' in values):
          try:
          height = float(values['height'])
      except ValueError:
          values['error'] = 'non-numeric height'
          return values

      if height < 0:
          values['error'] = 'Heights needs to be .GE 0'
          return values

测试案例:100_101失败并且100_120通过了

def test100_010HeightLowBound(self):
    dict = nav.adjust({'op': 'adjust', 'observation': '3d.13','height': '0'})
    self.assertEquals('0', dict['height'])

def test100_020OutofBound(self):
    dict = nav.adjust({'op': 'adjust', 'observation': '3d1.3', 'height': '-1'})
    self.assertEquals('Heights needs to be .GE 0', dict['error'])

由于测试失败而产生错误: self.assertEquals('0',dict ['height']) TypeError:“ NoneType”对象没有属性“ getitem

1 个答案:

答案 0 :(得分:0)

如果存在height键和height >= 0,则不会返回任何内容。这意味着dict将是None,并且您将得到所得到的错误。您只需要确保在所有实例中都返回一个可用的值即可。

def adjust(values):
      height = 0

      if ('height' in values):
          try:
             height = float(values['height'])

          except ValueError:
              values['error'] = 'non-numeric height'
              return values

      if height < 0:
          values['error'] = 'Heights needs to be .GE 0'

      return values # Return values regardless of the previous checks

尽管似乎没有必要返回values。您要做的就是更改参数。您可以只使用mutated参数。

def adjust2(values):
      height = 0

      if ('height' in values):
          try:
              height = float(values['height'])

          except ValueError:
              values['error'] = 'non-numeric height'
              return

      if height < 0:
          values['error'] = 'Heights needs to be .GE 0'

def test100_010HeightLowBound(self):
    data = {'op': 'adjust', 'observation': '3d.13','height': '0'}
    nav.adjust(data)
    self.assertEquals('0', data['height'])

并且正如注释中所指出的,给变量命名与内置变量同名是一个坏主意。我将dict重命名为data,所以您不会隐藏内置的dict函数。