我尝试做的是在我的程序中创建菜单式启动,让用户选择是否要验证代码或生成代码。代码如下所示:
choice = input("enter v for validate, or enter g for generate").lower()
try:
choice == "v" and "g"
except TypeError:
print("Not a valid choice! Try again")
restartCode() *#pre-defined function, d/w about this*
所以我希望我的程序输出那个print语句,并在用户输入" v"以外的其他内容时执行该定义的函数。或" g" (不包括他们输入这些字符的大写版本时)。 我的try和except函数有问题,但每当用户输入除2个字符以外的东西时,代码就会结束。
答案 0 :(得分:2)
尝试。
choice = input("enter v for validate, or enter g for generate").lower()
if (choice == "v") or (choice == "g"):
#do something
else :
print("Not a valid choice! Try again")
restartCode() #pre-defined function, d/w about this*
但是,如果你真的想坚持尝试/除了你可以存储所需的输入,并与它们进行比较。错误将是KeyError而不是TypeError。
choice = input("enter v for validate, or enter g for generate").lower()
valid_choices = {'v':1, 'g':1}
try:
valid_choices[choice]
#do something
except:
KeyError
print("Not a valid choice! Try again")
restartCode() #pre-defined function, d/w about this
答案 1 :(得分:2)
您对try/except
的作用感到困惑。当可能引发错误时使用try/except
。不会出现错误,因为程序中的所有内容都有效。仅当代码中存在执行错误时才会引发错误。错误不仅仅是在你需要的时候提出的。
您但是,如果用户未输入有效选项,则希望显示错误。您需要使用if/else
逻辑,并自行打印错误。作为旁注,行choice == "v" and "g"
不会测试选择是否等于'v'
或'g'
。它测试选择i是否等于v以及字符串'g'
是否为“truthy”。你的意外说法
if variable = value and True
我很确定这不是你想要的。以下是我将如何重新编写代码。
if choice.lower() in {"v", "g"}: # if choice is 'v' or 'g'
# do stuff
else: # otherwise
print("Not a valid choice! Try again") # print a custom error message.
答案 2 :(得分:2)
问题不在于您的try
和except
,而在于您完全使用try
和except
。 try
块中的代码不会给您错误,因此永远不会触发except
。您想使用if
语句。
此外,您的条件仅检查choice == "v"
,因为它被评估为(choice == "v") and "g"
,而"g"
是不是长度为0的字符串,因此始终是“真实的”(视为真实在布尔上下文中)。任何and
True都没有改变,因此只有第一个测试才有意义。执行此测试的最佳方法是使用in
。
最后,您可以而且应该使用while
循环重复提示,直到用户输入有效条目。
总而言之,你需要这样的东西:
prompt = "Enter v for validate, or g for generate >"
choice = input(prompt).strip().lower()[:1] # take at most 1 character
while choice not in ("v", "g"):
print("Not a valid choice! Try again.")
choice = input(prompt).strip().lower()[:1]
如果您想到如何将代码概括为再次使用它(正如您可能会在脚本的其余部分中那样),那么这样做很容易也很有用。首先,您可以将input
内容分解为单独的函数,因为它被调用了两次:
def input1char(prompt):
return input(prompt + " >").strip().lower()[:1]
然后将while循环分解为它自己的函数:
def validinput(prompt, options):
letters = tuple(options)
choice = input1char(prompt)
while choice not in options:
print("'%s' is not a valid choice! Try again." % choice)
choice = input1char(prompt)
return choice
然后你就写了:
choice = validinput("Enter v for validate, or g for generate", "vg")