gpt4 book ai didi

python-3.x - python argparse在使用特定选项时忽略其他选项

转载 作者:行者123 更新时间:2023-12-03 23:14:38 24 4
gpt4 key购买 nike

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

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

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

(它将生成一个 svg,其中包含以指定或默认字体书写的 foo 字样)

现在我希望也能够让这个命令接受以下调用...
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 option 的行为与我希望的一样,因为仍然需要两个位置参数。

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

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

最佳答案

argparse 允许您根据 action 定义在遇到参数时要采取的任意操作。 add_argument 的关键字参数( see the docs )

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

这可能是这样的:

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)

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

关于python-3.x - python argparse在使用特定选项时忽略其他选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53434478/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com