Argparse确认

3

我在我的程序中使用argparse,创建一个参数,允许用户从Amazon S3存储桶中删除文件。我是这样创建它的:

parser.add_argument("-r", "--remove",type = str, help= "Delete a file (enter full path to file)" , default = '' )

然后我检查文件是否存在,如果是,则将其删除:

if args.remove:
    b = Bucket(conn,default_bucket)
    k = Key(b)
    if b.get_key(args.remove):
        b.delete_key(args.remove)
        print ( ' {0} Has been removed'.format(args.remove.split("/")[-1]) )
    else:
        print ( " No files named '{0}' found ".format(args.remove.split("/")[-1] ) )
        print ( ' Please check the bucket path or file name. Use -l command to list files')

我想知道是否有办法提示用户确认是否真的要删除文件,这通常是删除文件时会出现的情况(每个程序都会这样做)。就像这样:

>python myprog.py -r foo.txt
>Are your sure [Y/N] : Y
>File deleted
2个回答

1

从阅读文档来看,我会使用子类化argparse.Action的能力来实现当您看到该参数时的自定义行为。我将在文档中包含一个稍微修改过的代码版本供您使用。

class CheckDeleteAction(argparse.Action):
    def __init__(self, option_strings, dest, nargs=None, **kwargs):
        if nargs is not None:
            raise ValueError("nargs not allowed")
        super(CheckDeleteAction, self).__init__(option_strings, dest, **kwargs)

    def __call__(self, parser, namespace, values, option_string):
        # put your prompting and file deletion logic here
        pass

添加这个 parser.add_argument("-r", "--remove", type=str, help="msg", default='', action=CheckDeleteAction) 来使用该类。


1

我曾经遇到过同样的问题(在不同的CLI中)。我建议您使用这里给出的答案。看看James给出的答案。它相当容易理解。像这样使用:

if args.remove:
    b = Bucket(conn,default_bucket)
    k = Key(b)
    if b.get_key(args.remove):
        if yes_no('Are you sure: ')
            b.delete_key(args.remove)
            print ( ' {0} Has been removed'.format(args.remove.split("/")[-1]) )
    else:
        print ( " No files named '{0}' found ".format(args.remove.split("/")[-1] ) )
        print ( ' Please check the bucket path or file name. Use -l command to list

我已经解决了这个问题。但是使用了一个非常“糟糕编码”的自己的解决方案。这个新方案好多了,我可以在许多地方使用它。谢谢! - letsc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接