Python-使用isalpha在int上无值错误

Python-使用isalpha在int上无值错误,python,python-3.x,Python,Python 3.x,为什么这次尝试没有引发ValueError/除非isalpha失败 我知道如果给定一个数字,isalpha返回false In [9]: ans = input("Enter a Letter") Enter a Letter4 In [10]: ans.isalpha() Out[10]: False 如果他们提供的是数字而不是y或n,如何获得值错误?因为如果尝试是错误的,它不应该停止是真的,而不打印我的轨迹吗 import sys v0 = float(input("What velo

为什么这次尝试没有引发ValueError/除非isalpha失败

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

In [9]: ans = input("Enter a Letter")
Enter a Letter4

In [10]: ans.isalpha()
Out[10]: False
如果他们提供的是数字而不是y或n,如何获得值错误?因为如果尝试是错误的,它不应该停止是真的,而不打印我的轨迹吗

import sys

v0 = float(input("What velocity would you like? "))
g = float(input("What gravity would you like? "))
t = float(input("What time decimal would you like? "))

print("""
    We have the following inputs.
       v0 is %d
       g is  %d
       t is  %d
    Is this correct? [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("Not a valid entry", err.answer)
        sys.exit()
    finally:
            print("would you like another?")
            break
例如,如果用户键入5而不是y或n,仍然会得到答案

$ python3 ball.py 
What velocity would you like? 2
What gravity would you like? 3
What time decimal would you like? 4

    We have the following inputs.
       v0 is 2
       g is  3
       t is  4
    Is this correct? [Y/n]

     >> 5
-16.0
would you like another?

您需要自己提出错误。键入您不喜欢的内容不会引发任何异常:

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()
除了ValueError as err:仅在抛出ValueError时发生。answer的值为False,但这只是一个任意布尔值,不是错误

有关错误的示例,请参见

在您的情况下,只需测试:

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

一般来说,您应该更喜欢使用普通的控制流逻辑来处理一系列用户输入,而不是引发/捕获异常。

为了清晰起见,发布了一个答案,试图提供一种更一致和明确的方法来处理字符串和int。通过使用isinstance,我向一个明确阅读我的代码的人声明,我的值有望提高可读性

answer = input("\t >> ")
if isinstance(int(answer), int) is True:
    raise ValueError("Ints aren't valid input")
    sys.exit()
elif isinstance(answer, str) is True:
        print(v0 * t - 0.5 * g * t ** 2)
else:
    print("Ok please ammend your entries")
如果我以后有不同的需求,这可以很容易地抽象成一个函数,因为iInstance允许检查多种类型,这增加了灵活性

参考文献


正如您已经说过的,isalpha返回True | False。为什么您希望它会引发ValueError?@SiHa从几个SO示例中得出答案,例如,如果int为false,它将引发ValueError。我想反过来会是真的,但那完全不同。在这种情况下,他们试图将非数字字符串转换为int,这会引发异常,因为这是不可能的。调用“4”。isalpha将返回False,但不会引发异常,因为没有发生异常-函数调用成功。我建议你在try上多读一点,除了要完全理解这个概念。但你并不是想把int转换成字符串,而是调用一个库函数来告诉你它是否是字母表中的一个字母。如下所述,使用异常来控制程序流通常是个坏主意。您的isalpha调用中有一个布尔值,在if语句中使用它,在这里忘记异常。另外,如果您确实尝试将int转换为字符串,那么无论如何也不会引发异常-“4”是一个完全有效的字符串:@SiHa谢谢,这个示例是根据我之前解决的一个问题设计的,我只是为了使用和学习try,但我认为用户在需要字符串时输入int是一个很好的用例。你认为这个错误答案有什么用?我还没有深入研究过。它不会打印出发帖前搜索到的答案的值,对于是否应该使用条件逻辑而不是try/except,它的观点似乎是混合的。在这种情况下,对我来说,仅仅使用try是一个人为的问题,除非用户没有输入Y或Y,否则我放弃了,只是试图在不是字母的情况下得到一个错误显式优于隐式。建议条件逻辑应该优先于try/except。你能在讨论这一点的地方发布几个链接吗?这里有一个问题我在发布中关闭了几个标签,然而,一个答案有63个表示try-except,另一个61个表示conditional,请特别注意一些注释,这些注释指示使用try-except作为首选项。带有63的答案是从外部函数捕获异常,而不是从局部变量的求值捕获异常。根据有效的Python,抛出异常的函数实际上比不返回异常的函数更可取,以表示特殊的含义。但这种情况与评估variable@sayth在你提到的情况下,我赞成例外。simulate函数在正常异常中返回一个布尔值,而except捕获意外故障。打印部分工作正常,似乎无法将int转换为字符串以表示故障,ValueError是我的撤消操作。在测试isalpha时,我只收到布尔值。你能给出一个例子,当用户输入一个数字时,v、g和t的值,以及打印的内容吗?例如,语句print3*'4'-0.5*5*'4'**2引发了一个TypeError。我在更新的问题中遇到了它,因为int为2 3 4,返回-16.0OK,这是我误解的。我以为它指的是用户输入。
def testSomething(arg1, **types):
    if isintance(arg1, [types]):
        do_something