在Python中检查多种类型以引发异常

时间:2020-08-31 09:39:55

标签: python conditional-statements

我正在手动尝试异常以完全理解它们,并且我创建了如下代码:

def misterio(a,b):
    if type(a) or type(b) != ("int") and ("float"):
        raise TypeError ("Arguments should be numbers" .format(a,b))
    else:

        if (b<0):
            raise ValueError ("B cant be 0")
        elif (b==1):
            return a
        else:
            return a+misterio(a,b-1)

print(misterio(3,2))
print(misterio(3,"a"))
print(misterio(3,1))

但是它没有通过第一个if。我要做的就是检查我的参数是否为数字(我知道b应该至少大于1,但我正在逐步进行操作)。有没有办法以最pythonic的方式做到这一点?原因即使我俩都是if,我仍然不明白为什么它没有超过第一个int

2 个答案:

答案 0 :(得分:1)

你想要

def misterio(a, b):
    if not all(isinstance(x, (int, float)) for x in [a, b]):
        raise TypeError("Arguments should be numbers.")
    else:

        if (b < 0):
            raise ValueError("B cant be 0")
        elif (b == 1):
            return a
        else:
            return a + misterio(a, b - 1)


print(misterio(3, 2))
print(misterio(3, "a"))
print(misterio(3, 1))

首先,使用isinstance(...)代替type(...),然后使用第二个:

if type(a) or ...

即使aNone,也始终返回true:

a = None

if type(a) or None:
    print("Yes")

与您的实际错误无关,但是您没有在错误消息中使用ab,因此我将其省略。

答案 1 :(得分:-2)

我也发现这也可行。我不知道为什么我在发布问题后总是会在几分钟内找到解决方案。谢谢大家!

def misterio(a,b):
    if type(a) is not (int or float) or type(b) is not (int or float):
        raise TypeError ("Arguments should be numbers" .format(a,b))
    else:

        if (b<0):
            raise ValueError ("B cant be 0")
        elif (b==1):
            return a
        else:
            return a+misterio(a,b-1)
            
print(misterio(3,2))
print(misterio(-2, 2))
print(misterio('bruh', 2))