首页 > 解决方案 > 单独工作或与所有其他参数一起工作的可选标志(如 -h)

问题描述

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

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

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

conv.py -f val from to

但也像这样:

conv.py -f

我知道应该可以这样做,因为-hargparse 中的内置标志以类似的方式工作,您可以说conv.py val from toorconv.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本身或与所有其他参数一起接受标志的存在。任何帮助表示赞赏。

标签: pythoncommand-line-argumentsargparse

解决方案


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

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")无论是否发送了所需的参数,都不会到达。您可以从操作实例中访问解析器命名空间。


推荐阅读