Python中的input()函数可以动态检测输入的数据类型吗?

时间:2019-07-12 20:26:47

标签: python python-3.x input dynamic integer

所以我当时使用Python 3.7制作控制台应用程序;很大程度上取决于输入(wowz)。

应用程序的功能是在两个整数变量的值之间“交换”。那不是问题所在,问题是当我尝试通过使用几个“ if语句”检查输入的数据类型来验证用户输入时,无论用户使用“ input()”功能进行输入;输入的数据类型将始终定义为“”

我只希望这小块ART动态运行。 (我希望input()函数动态检测输入的数据类型并将其分配给变量吗?plsss)

P.S .:我什么也没尝试,因为我发现所有的东西都是无用的。我猜。 (告诉我使用 int()函数,例如:{

# Works just fine when input is fully composed of integral numbers. 
a = int(input("Enter an integer as a value for A: "))

} (下面第5行的编辑)

我不想使用 int()函数;如果用户输入的字符串不完全由整数组成,则可能会引起很多问题。 (ValueError)

def swap(x, y):
    return y, x
aValid = 1
bValid = 1
a = input("Enter an integer as a value for A: ")
if (str(type(a)) != "<class 'int'>"):
    print("Please take us seriously, we're watching you.\n")
    aValid = 0
    while (aValid == 0):
        a = input("Enter an integer as a  value for A: ")
        if str(type(a)) != "<class 'int'>":
            print("Please take us seriously, we're watching you.\n")
            aValid = 0
        else:
            aValid = 1

# ! To be worked on:

b = input("Now, Please enter the value for B: ")
print("A = " , a)
print ("B = ", b)

a, b = swap(a, b)

print("Now:\nA = ", a)
print("B = ", b)

我希望 Python 3.7(32位)中的 input()函数可以动态检测输入的数据类型并将其分配变量以及输入本身。

但是实际上发生的是,它总是将输入的数据类型分配为(<之前和之后没有空格,),这会使程序陷入无限循环,这让我很头疼;我的愚蠢。

3 个答案:

答案 0 :(得分:1)

因此,在python 2中,input()函数将检测用户输入的类型。但是,在python3中,input()在python 2中是指raw_input()。为了动态检测类型,可以使用ast,特别是ast.literal_eval

您可能会编写如下自己的输入函数:

import ast

def input_detect(s):
    return ast.literal_eval(input(s))

,然后您的代码将如下所示:

import ast

def input_detect(s):
    return ast.literal_eval(input(s))

def swap(x, y):
    return y, x
aValid = 1
bValid = 1
a = input_detect("Enter an integer as a value for A: ")
if (str(type(a)) != "<class 'int'>"):
    print("Please take us seriously, we're watching you.\n")
    aValid = 0
    while (aValid == 0):
        a = input_detect("Enter an integer as a  value for A: ")
        if str(type(a)) != "<class 'int'>":
            print("Please take us seriously, we're watching you.\n")
            aValid = 0
        else:
            aValid = 1

# ! To be worked on:

b = input_detect("Now, Please enter the value for B: ")
print("A = " , a)
print ("B = ", b)

a, b = swap(a, b)

print("Now:\nA = ", a)
print("B = ", b)

答案 1 :(得分:0)

也许while循环和try/except是捕获和验证输入的一种更可靠的方法。此外,我们避免使用eval/literal_eval,这可能会给安全性带来问题。

例如:


a = None
b = None

while a is None: 
    try: 
        a = int(input("Enter an integer as a value for A: "))
    except ValueError:
        continue

while b is None:
    try:
        b = int(input("Enter an integer as a value for B: "))
    except ValueError:
        continue

print("A is {}".format(a))
print("B is {}".format(b))

a, b = b, a

print("A is now {}".format(a))
print("B is now {}".format(b))

这样,您的代码将更加健壮,因为您不必考虑其他类型的检查,并且如果要编写验证功能(例如validate_user_input),则可以添加大量检查如果它们失败,请提出一个ValueError,并且您的代码几乎不会更改。

答案 2 :(得分:0)

在python 3中,输入函数为raw_input。这意味着它将始终是一个字符串。但是,如果希望它采用其值的格式,则应使用:ast.literal_eval()函数。 请注意:请勿使用eval()函数!不安全,因为我可以从计算机中删除文件。

也:不要使用交换功能,这是非Python的。 x,y = y,x