【发布时间】:2016-05-22 23:46:31
【问题描述】:
我经常负责询问用户的意见。我一直只是在我的主要执行脚本中“按需”编写提示。这有点难看,因为我经常要求跨多个脚本输入相同类型的输入,所以我的大量代码只是复制/粘贴提示循环。这是我过去所做的:
while True:
username = input("Enter New Username: ")
if ldap.search(username):
print " [!] Username already taken."
if not validator.validate_username(username):
print " [!] Invalid Username."
else:
break
我想创建一些可以这样称呼的东西:
username = prompt(prompt="Enter New Username: ",
default=None,
rules=["user_does_not_exist",
"valid_username"])
那么提示函数是这样的:
def prompt(prompt, default, rules):
while True:
retval = input(prompt)
if default and retval == "":
break
return default
if not rule_match(retval, rules):
continue
break
return retval
def rule_match(value, rules):
if "user_does_not_exist" in rules:
if not user.user_exists(value):
return False
if "valid_username" in rules:
if not validator.username(value):
return False
if "y_n_or_yes_no" in rules:
if "ignore_case" in rules:
if value.lower() not in ["y", "yes", "n", "no"]:
return False
else:
if value not in ["y", "yes", "n", "no"]:
return False
return True
我正在考虑的另一种方法是创建一个 Prompt 类,这将使结果具有更大的灵活性。例如,如果我想将“y”或“n”转换为 True 或 False,上述方法实际上并不起作用。
create_another = Prompt(prompt="Create another user? (y/n): ,"
default=False,
rules=["y_n_or_yes_no",
"ignore_case"]).prompt().convert_to_bool()
我正在考虑的另一种选择是制作个性化的提示并命名它们,每个提示都与我的原始代码相似。这实际上并没有改变任何东西。它只是将这些循环从我的主执行代码中取出,从而使主执行代码更易于浏览:
username = prompt("get_new_username")
def prompt(prompt_name):
if prompt_name == "get_new_username":
while True:
username = input("Enter New Username: ")
if ldap.search(username):
print " [!] Username already taken."
if not validator.validate_username(username):
print " [!] Invalid Username."
else:
break
return username
if prompt_name == "y_n_yes_no_ignore_case":
# do prompt
if prompt_name == "y_n_yes_no":
# do prompt
if prompt_name == "y_n":
# do prompt
if prompt_name == "y_n_ignore_case":
# do prompt
if prompt_name == "yes_no":
# do prompt
if prompt_name == "yes_no_ignore_case":
# do prompt
我意识到,为我的所有程序确定一种可接受的“y/n”格式可能只是一个好主意,我会的。这只是为了表明,在我需要一个非常相似但略有不同的提示的情况下,它会导致大量的复制/粘贴代码(这种方法根本没有灵活性)。
编写干净、灵活且易于维护的用户提示的好方法是什么?
(我看过这个:Asking the user for input until they give a valid response 和其他一些回复。我的问题不是关于如何获取输入和验证它,而是关于如何制作一个可以跨多个程序重复使用的灵活输入系统)。
【问题讨论】:
-
我一直发现我的用例需要定制到足以使编写通用解决方案变得困难。不过,我很高兴看到是否有人提出了实用的解决方案,这是个好问题。
-
设计一个灵活、可重用的提示系统有点超出了 Stack Overflow 的范围。
-
@chepner 好吧,这是我的问题!它是否必须真正深入“设计”(在这种情况下,我同意,我们不能在 SO 答案中发布整个程序),或者,这是我的问题,是否有一些解决方案或方法这是我没想到的干净简单的东西吗?根据我收集到的信息,答案是这确实是一个需要复杂解决方案的问题。即使在前者的情况下,我认为这个问题仍然具有价值,可以向其他有类似问题的人表明,在一篇文章中回答确实不够简单。
标签: python python-3.x input prompt