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()