Python - int类型的isalpha()方法不会引发ValueError错误。

8 浏览
0 Comments

Python - int类型的isalpha()方法不会引发ValueError错误。

为什么在try/except语句中,当isalpha应该失败时,没有引发ValueError错误。

我知道如果给定一个数字,isalpha会返回false。

In [9]: ans = input("输入一个字母")
输入一个字母4
In [10]: ans.isalpha()
Out[10]: False

如果用户提供的是数字而不是y或n,我该如何获得值错误?因为如果try语句是false,它不应该停止为真并且不打印我的路径吗?

import sys
v0 = float(input("你想要什么速度?"))
g = float(input("你想要什么重力?"))
t = float(input("你想要什么时间(小数)?"))
print("""
    我们有以下输入。
       v0 是 %d
       g 是  %d
       t 是  %d
    这正确吗?[Y/n]
""" % (v0, g, t))
while True:
    try:
        answer = input("\t >> ").isalpha()
        print(v0 * t - 0.5 * g * t ** 2)
    except ValueError as err:
        print("不是有效的输入", err.answer)
        sys.exit()
    finally:
            print("你还想要其他的吗?")
            break

例如,如果用户输入5而不是y或n,仍会得到一个答案

$ python3 ball.py 
你想要什么速度?2
你想要什么重力?3
你想要什么时间(小数)?4
    我们有以下输入。
       v0 是 2
       g 是  3
       t 是  4
    这正确吗?[Y/n]
     >> 5
-16.0
你还想要其他的吗?

0
0 Comments

在上述代码中,问题出现的原因是在输入的字符串中包含非字母字符时,并没有引发异常。为了解决这个问题,我们需要自己引发异常。

具体的解决方法如下:

try:
    answer = input("\t >> ").isalpha()
    if not answer:
        raise ValueError
    print(v0 * t - 0.5 * g * t ** 2)
except ValueError as err:
    print("Not a valid entry", err.answer)
    sys.exit()

在上述代码中,我们使用了try-except语句块来捕获可能引发的异常。首先,我们使用input()函数获取用户输入的字符串,并使用isalpha()方法来检查该字符串是否只包含字母字符。如果字符串中包含非字母字符,我们会手动引发一个ValueError异常。然后,我们打印出一个错误消息,并输出err.answer来显示错误的具体原因。最后,我们使用sys.exit()函数退出程序。

值得注意的是,在代码中的err.answer并不会打印出answer的值。这是因为异常对象并没有一个名为answer的属性。

0
0 Comments

在一般情况下,应该优先使用正常的控制流逻辑来处理用户输入的范围,而不是引发/捕获异常。

打印部分工作正常,似乎我无法将int转换为string以便处理失败和ValueError。在测试isalpha()时,我只收到布尔值。

当用户输入一个数字时,你能给出vgt的值的示例以及打印的内容吗?例如,语句print(3 * '4' - 0.5 * 5 * '4' ** 2)会引发一个TypeError

我在我的更新问题中有了答案,对于2、3、4这样的整数返回-16.0。

好的,我误解了。我以为t是指用户输入。

0
0 Comments

Python - No valuerror on int with isalpha

在Python中,当我们使用int()函数将一个非数字字符串转换为整数时,通常会引发ValueError异常。然而,有时候我们可能会遇到一个奇怪的情况,即当我们使用isalpha()方法判断一个字符串是否只包含字母时,即使这个字符串是一个数字,也不会引发ValueError异常。下面我们来探讨一下这个问题的原因以及解决方法。

在上述代码中,我们可以看到使用了tryexcept来捕获可能引发的ValueError异常。然而,在这个特定的情况下,ValueError异常并没有被引发,因为answer的值是一个布尔值False,而不是一个错误。

为了解决这个问题,我们可以使用条件逻辑来替代tryexcept。我们可以使用isalpha()方法来判断用户输入的字符串是否只包含字母,如果是,则执行相应的逻辑,如果不是,则继续循环等待用户输入。

下面是一个简单的示例代码:

answer = input("\t >> ")
if answer.isalpha():
    print(v0 * t - 0.5 * g * t ** 2)
    break

在这个示例代码中,我们使用isalpha()方法来判断用户输入的字符串是否只包含字母,如果是,则执行相应的逻辑。如果用户输入的字符串包含非字母字符,则继续循环等待用户输入。

在查找解决方法之前,我们可以看到在使用tryexcept之前,有一段对于使用条件逻辑和try/except的混合意见。一些人认为应该优先使用条件逻辑,而另一些人则认为应该优先使用try/except。然而,在这个特定的问题中,我们可以看到使用条件逻辑是更合适的解决方法。

事实上,Python的设计原则之一是"明确胜于隐式",即明确错误处理逻辑要优于隐式的错误处理。这意味着我们应该尽量使用条件逻辑来处理可能出现的错误,而不是依赖于try/except来捕获异常。

下面是一些关于这个问题讨论的链接:

- stackoverflow.com/q/2020598/461887

在这个链接中,有两个答案分别提到了使用try/except和条件逻辑的优缺点。其中一个答案中提到,当处理来自外部函数的异常时,使用try/except是更合适的。而在我们的问题中,我们是在对一个变量进行求值时捕获异常,所以使用条件逻辑是更好的选择。

我们可以得出结论,在处理可能出现的错误时,应该优先使用条件逻辑而不是依赖于try/except来捕获异常。这样可以使代码更加明确,减少不必要的异常处理逻辑。

0