可选标志,可单独使用或与所有其他参数一起使用(如 -h)

Optional flag that works by itself or with all other arguments (like -h)

我意识到标题可能会让人困惑,但我不知道如何表达我的问题。

我的程序的命令行语法如下所示: conv.py val from to,其中 to 是可选的,但我认为这不重要。

我正在尝试添加一个标志,强制我的程序忽略缓存数据并更新其数据库。它应该像这样工作:

conv.py -f val from to

也喜欢这样:

conv.py -f

我知道应该可以这样做,因为 argparse 中的内置 -h 标志以类似的方式工作,您可以说 conv.py val from toconv.py -hconv.py -h val.但是,我不知道如何实现这一目标。 我当前的代码只有 -f 标志作为可选参数:

def parse_args():
    parser = argparse.ArgumentParser(prog='conv')
    parser.add_argument('-f', action='store_true')
    parser.add_argument('value')
    parser.add_argument('from_', metavar='from' )
    parser.add_argument('to', nargs='?', default='neg')
    args = parser.parse_args()
    return args.from_, args.to, args.value, args.f

我想使 -f 标志的存在本身或所有其他参数都可以接受。感谢任何帮助。

为此,您将创建一个退出解析的自定义操作:

import argparse

class MyAction(argparse.Action):

    def do_the_thing(self):
        print("hello from my action")

    def __call__(self, parser, namespace, values, option_string=None):
        self.do_the_thing()
        parser.exit()

parser = argparse.ArgumentParser()
parser.add_argument('value')
parser.add_argument('from_', metavar='from' )
parser.add_argument('to', nargs='?', default='neg')
parser.add_argument("-f", nargs=0, action=MyAction)
args = parser.parse_args()
print("after args parsed")

现在,如果传递了 -f,则无论是否发送了必需的参数,都不会到达 print("after args parsed")。您可以从操作实例中访问解析器命名空间。