参数错误

时间:2017-03-17 02:34:56

标签: python python-3.x parameters

所以我已经定义了一个名为change(a,d)的函数来计算给定面额d的数量变化。我还有一些参数:a必须是int类型,d必须是int类型列表,d的元素必须按升序排列,否则引发ChangeParameterError。我的代码如下:

class ChangeRemainderError(Exception):
   pass

class ChangeParameterError(Exception):
   pass

def change(a, d):
    if type(a) != int:
      raise ChangeParameterError
    if type(d) != type(list):
      raise ChangeParameterError
    if type(d) != d.sort():
      raise ChangeParameterError

   i, r, c = len(d)-1, a, len(d)*[0]
   while i >= 0:
     c[i], r = divmod(r, d[i])
     i = i-1
   return c
def printChange(a, d):
    try:
        print(change(a, d))
    except ChangeParameterError:
        print('needs an integer amount and a non-empty list \
of denominations in ascending order')
    except ChangeRemainderError:
        print('no exact change possible')
    except:
        print('unexpected error')

并且因为它正在为测试抛出ChangeParameterError它不应该这样做。例如: change(3, [3, 7]) == [1, 0]

返回ChangeParameterError,即使a是int,d是按升序排列的列表。并且错误消息并非真正有用。错误消息如下:

<ipython-input-39-62477b9defff> in change(a, d)
     19         raise ChangeParameterError
     20     if type(d) != type(list):
---> 21         raise ChangeParameterError
     22     if type(d) != d.sort():
     23         raise ChangeParameterError

ChangeParameterError: 

感谢任何帮助,谢谢!

1 个答案:

答案 0 :(得分:1)

您可以看到两个逻辑错误。试试这个:

def change(a, d):
    if type(a) != int:
      raise ChangeParameterError
    if type(d) != list:  # 1
      raise ChangeParameterError
    if d != sorted(d):  # 2
      raise ChangeParameterError

首先,type(list)将返回<type>类型。

其次,您在第三张检查中包含type(d),但它没有意义。此外,d.sort()不会返回任何内容;它对列表进行了排序。

此外,最好使用isinstance而不是检查type的返回值。