让Python在继续之前确认If/Elif/Else

让Python在继续之前确认If/Elif/Else,python,if-statement,Python,If Statement,我编写了一个简单的python脚本,用于获取命令行参数并将它们写入一个文件,以便使用Ansible部署到路由器。但在脚本创建输出文件之前,我想强制用户使用Y/N(Yes或No)条目确认请求 如何修改此脚本以在每个if/elif语句之后请求该脚本 #!/usr/bin/python import argparse import sys parser = argparse.ArgumentParser() parser.add_argument("-s", "--set", help="set"

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

如何修改此脚本以在每个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\u 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\u 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)

我尝试了一次,但它似乎陷入了一个循环,从未继续。我必须控制住它。[]$./test.py-s-i 10.0.0.1是否确实要设置?[是/否]是,您真的要设置吗?[是/否]^CTraceback(最近一次调用):文件“/test.py”,在if not ask_confirm(“您真的想设置吗?”)中的第29行:文件“/test.py”,在ask_confirm answer=input(msg+”[{}/{}]”中的第24行。格式(是[0],否[0]))KeyboardInterrupt@Alby,嗯,我刚试过,效果如预期。您到底是如何尝试的?我使用了非花式选项并得到了以下错误:[]$./test.py-s-i10.0.0.1是否确实要设置?[是/否]是回溯(最后一次调用):文件“/test.py”,第36行,在if not ask_confirm(“您真的想设置吗?”):文件“/test.py”,第15行,在ask_confirm answer=input(msg+“[yes/no]”文件),第1行,在NameError中:名称“是”未定义不确定是否重要,但我使用的是Python 2.7。5@Alby你能尝试添加
print(答案)吗;打印(回答是);在
ask\u confirm
方法中的
answer=input(…)
之后立即打印(回答否)