让 Python 在继续之前确认 if/elif/else



我编写了一个简单的python脚本来获取命令行参数并将它们写入文件,以便使用Ansible部署到路由器。但是在我的脚本创建该输出文件之前,我想强制用户使用 Y/N(是或否(条目确认请求。

如何修改此脚本以在每个 if/elif 语句之后请求该脚本?

#!/usr/bin/python
import argparse
import sys
parser = argparse.ArgumentParser()
parser.add_argument("-s", "--set", help="set", action="store_true")
parser.add_argument("-d", "--delete", help="delete", action="store_true")
parser.add_argument("-i", "--ipaddr", help="Target IP")
args = parser.parse_args()
if args.set:
print "Deploying: set routing-options static route %s" % (args.ipaddr)
filename = open("/var/tmp/output.txt",'w')
sys.stdout = filename
print "set routing-options static route %s" % (args.ipaddr)
elif args.delete:
print "Deploying: delete routing-options static route %s" % (args.ipaddr)
filename = open("/var/tmp/output.txt",'w')
sys.stdout = filename
print "delete routing-options static route %s" % (args.ipaddr)
else:
exit(1)

只需编写一个ask_confirm函数并在需要的地方调用它:

def ask_confirm(msg="Are you sure?"):
answer = ""
while answer not in ("yes", "no"):
answer = input(msg + " [yes/no]")
return (True if answer == "yes" else False)

默认值msg允许您使用泛型消息调用ask_confirm。 它返回一个布尔值,因此更易于处理。 如果需要,可以以更花哨的方式定制输入。 这是一个更高级的版本:

def ask_confirm(msg="Are you sure?", yes=None, no=None):
if yes is None:
yes = ["yes"]
if no is None:
no = ["no"]
if isinstance(yes, str):
yes = [yes]
if isinstance(no, str):
no = [no]
answer = ""
while answer not in yes and answer not in no:
answer = input(msg + " [{}/{}]".format(yes[0], no[0]))
return (True if answer in yes else False)

然后,您可以在每个块的开头要求确认:

if args.set:
if not ask_confirm("Do you really want to set?"):
sys.exit()
# else (not needed)
# proceed
elif args.delete:
if not ask_confirm("Are you sure you want to delete?"):
sys.exit()
# else (not needed)
# proceed
else:
sys.exit(1)

最新更新