调用具有错误输入类型的函数时打印“错误类型”-Python

时间:2018-09-11 02:34:25

标签: python python-3.x

我正在尝试在函数中输入错误的数据类型时显示错误消息。在这种情况下,我仅在调用函数时尝试接受intfloat。在函数中输入str应该返回错误消息

def isPrime(i):

    if not (type(i)==float or type(i)==int):
        print("Input wrong type")
        return None

    i = abs(int(i))

    if i == 2 or i == 1: 
        return True    

    if not i & 1: 
        return False

    for x in range(3, int(i**0.5) + 1, 2):
        if i % x == 0:
            return False

    return True

# Wanting the code to return an error
isPrime(bob) 

2 个答案:

答案 0 :(得分:1)

如果您使用的是Python 3.5+,则可以将类型提示与以下修饰符(我从@MartijnPieters的typeconversion decorator改编而成)一起使用,以强制执行类型提示:

import functools
import inspect

def enforce_types(f):
    sig = inspect.signature(f)
    @functools.wraps(f)
    def wrapper(*args, **kwargs):
        bound = sig.bind(*args, **kwargs)
        bound.apply_defaults()
        args = bound.arguments
        for param in sig.parameters.values():
            if param.annotation is not param.empty and not isinstance(args[param.name], param.annotation):
                raise TypeError("Parameter '%s' must be an instance of %s" % (param.name, param.annotation))
        result = f(*bound.args, **bound.kwargs)
        if sig.return_annotation is not sig.empty and not isinstance(result, sig.return_annotation):
            raise TypeError("Returning value of function '%s' must be an instance of %s" % (f.__name__, sig.return_annotation))
        return result
    return wrapper

@enforce_types
def isPrime(i: float) -> bool:
    i = abs(int(i))
    if i == 2 or i == 1: 
        return True    
    if not i & 1: 
        return False
    for x in range(3, int(i**0.5) + 1, 2):
        if i % x == 0:
            return False
    return True

这样:

print(isPrime(1))
print(isPrime(1.0))

都将输出True,但是:

print(isPrime('one'))

会引发以下异常:

TypeError: Parameter 'i' must be an instance of <class 'float'>

答案 1 :(得分:0)

所以:

if not (type(i)==float or type(i)==int):
    print("Input wrong type")
    return None

可以简化为:

if not isinstance(i,(float,int)):
    print("Input wrong type")
    return None

然后执行错误消息:

if not isinstance(i,(float,int)):
    raise TypeError('Your Text here') #You can do any error i do `TypeError` just for now.

然后创建自己的错误消息:

class MyError(Exception):
    pass

然后在这里

if not isinstance(i,(float,int)):
    raise MyError('Your Text here')

但是我更喜欢使用TypeError来犯错