如何在用户输入上运行str(),int(),float()等时最有效地避免ValueError

时间:2019-05-27 20:55:58

标签: python-3.x

我想简化测试和控制流程,以在对其运行str()或int()之前检查用户输入是否是正确的数据类型。

我已经解决了这个问题。这只是不完整的,可能效率不高。这实际上是我拥有的user_prompt函数内部的一个函数,这是“ form_check()”部分,这正是本主题所关注的部分,因此我将其余代码省去了。

# the following is run on input from the user = indata
# with a string telling the user what type of data to give = req
def form_check(req, indata):
    if "int" in req:
        req = "int"
        if indata.isnumeric():
            print(req)
            return int(indata)
        else:
            exit(1)
    elif "str" in req:
        req = "str"
        if indata.isalnum():
            print(req)
            return str(indata)
        else:
            exit(1)
    elif "list" in req:
        req = "list"
        if indata.startswith("(") and indata.endswith(")"):
            print(req)
            return list(indata) # I know this isn't right but need to research; lists and dicts are new to me still
        else:
            exit(1)
    else:
        print("fail")
        exit(1)

从我的输出中...

>  USER: Prompting user for a number
                        Give input as integer
> 3243432
int
>  USER: Prompting user for your name
                        Give input as string
> sdfsaf243
str
>  USER: Prompting user for whatever
                        Give input as list
> (SDf)
list
3243432 sdfsaf243 ['(', 'S', 'D', 'f', ')']

从输出中可以看到,此代码通过并且没有错误,但仅开始解决我想做的事情。

1 个答案:

答案 0 :(得分:0)

在这里只需要str,float和int。 input始终返回一个字符串。因此,所有输入都可以通过拆分为字符变成一个列表。您可以将try / except用作int / float,并使用str作为后备:

def form_check(req, data):
    if req in (int, 'int'):
        try:
            return int(data)
        except ValueError:
            exit(1)
    elif req in (float, 'float'):
        try:
            return float(data)
        except ValueError:
            exit(1)
    return str(data)

但是,如果您为错误的输入而调用exit(1),则对用户提出诸如ValueError('input must be convertible to "int"')之类的适当异常以使用户知道程序失败的原因对用户来说更有利。

如果您希望用户输入值列表,最好让他们输入用逗号分隔的值,然后返回:

[item.strip() for item in data.split(',')]