类型错误之间的区别

Differ between type errors

我有一个函数说:

def foo(a, b, c):
  ...

由于缺少以下参数,我可以处理 TypeError

try:
  foo(1, 2)
except TypeError:
  print("Arguments are not ok.")

出现类型错误的原因有很多,例如:

这里的问题是我想知道错误是因为提供的参数少还是提供的参数太多而引发的。

是的,我可以使用 if 语句检查错误消息的内容,但这似乎效率不高。有没有更好的方法并且可能更有效?

您可以给每个参数一个默认值并检查它,还可以添加一个包罗万象的东西

def foo(a=None, b=None, c=None, *_too_much):
    if a == None:
        pass  # argument-checks here
    ...
    if _too_much:
        pass  # Too many arguments handling here

但是,您的用例是什么?更详细地处理交互使用或其他用途的使用错误?如果您的用户没有专门在 REPL 或其他东西中使用它,那么可能有更好的方法来做您想要的。

不确定这背后的意图是什么,因为异常处理给出了明确的失败原因。但如果您需要这样做,那么这里可能对您有用:

try:
    # Call to the function
except TypeError as ex:
    if (re.search(r"missing.*positional argument", str(ex))):
        print ("Less no. of arguments passed")
    elif (re.search(r".*takes\s*\d+.*but.*were given", str(ex))):
        print ("Too many arguments passed")
    else:
        print ("Another error")

我找到了解决方法:

import inspect

def foo(x, y, z):
   ...

args = (1, 2)
try:
  foo(*args)
except TypeError:
  fooargs = inspect.getfullargspec(foo).args

  if len(fooargs) > len(args):
    print('Less arguments passed')

  elif len(fooargs) < len(args):
    print('Too many arguments passed')