python argparse 当使用特定选项时忽略其他选项

2023-12-09

我正在编写一个 python 程序,我希望有一个以特定方式运行的命令行界面

命令行界面应接受以下调用:

my_prog test.svg foo
my_prog --font=Sans test.svg foo

(它将生成一个带有单词的 svgfoo以指定或默认字体书写)

现在我希望也能够让这个命令接受以下调用......

my_prog --list-fonts

这将列出所有有效选项--font由系统上可用的字体决定。

我在用argparse,我有这样的东西:

parser = argparse.ArgumentParser()

parser.add_argument('output_file')
parser.add_argument('text')
parser.add_argument('--font', help='list options with --list-fonts')
parser.add_argument('--list-fonts', action='store_true')

args = parser.parse_args()

然而这并不意味着--list-fonts选项的行为如我所愿,因为仍然需要两个位置参数。

我也尝试过使用子解析器,但仍然需要一种解决方法来防止每次都需要其他选项。

如何使用 argparse 获得所需的行为。


argparse 允许您根据参数定义遇到参数时要采取的任意操作action关键字参数add_argument (请参阅文档)

您可以定义一个操作来列出字体,然后中止参数解析,这将避免检查其他必需的参数。

这可能看起来像这样:

class ListFonts(argparse.Action):
    def __call__(self, parser, namespace, values, option_string):
        print("list of fonts here")
        parser.exit() # exits the program with no more arg parsing and checking

然后你可以将它添加到你的论点中,如下所示:

parser.add_argument('--list-fonts', nargs=0, action=ListFonts)

Note nargs=0已添加,以便该参数不需要值(问题中的代码通过action='store_true')

该解决方案有一个副作用,即启用如下所示的调用也可以列出字体并退出而不运行主程序:

my_prog --font Sans test.svg text --list-fonts

这可能不是问题,因为它不是典型的用例,特别是如果帮助文本解释了这种行为。

如果为每个此类选项定义一个新类感觉太重量级,或者您可能有多个具有此行为的选项,那么您可以考虑使用一个函数来实现每个参数所需的操作,然后使用一种工厂函数返回一个包装该函数的类。下面显示了一个完整的示例。

def list_fonts():
    print("list of fonts here")

def override(func):
    """ returns an argparse action that stops parsing and calls a function
    whenever a particular argument is encountered. The program is then exited """
    class OverrideAction(argparse.Action):
        def __call__(self, parser, namespace, values, option_string):
            func()
            parser.exit()
    return OverrideAction

parser = argparse.ArgumentParser()

parser.add_argument('output_file')
parser.add_argument('text')
parser.add_argument('--font', help='list options with --list-fonts')
parser.add_argument('--list-fonts', nargs=0, action=override(list_fonts),
    help='list the font options then stop, don\'t generate output')
args = parser.parse_args()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python argparse 当使用特定选项时忽略其他选项 的相关文章

随机推荐