【发布时间】:2022-09-24 00:10:59
【问题描述】:
我有一个通常使用 2 个位置参数和一堆可选参数调用的脚本。
script.py <file1> <file2>
我想添加另一个子解析器,当我传递一个可选参数时应该调用它。
script.py -file_list <files.list>
基本上,我要求的是当-file_list 被传递时,解析器不应该寻找file1 和file2。我不希望默认情况需要另一个选项来调用它(因为默认情况已经在使用中,因此我不想破坏它)。
我尝试保持默认解析器不变并为-file_list 创建子解析器。但是解析器仍然需要位置参数file1 和file2。
示例代码(这不像我想要的那样工作):
args = argparse.ArgumentParser()
#default arguments
args.add_argument(\"file1\", type=str)
args.add_argument(\"file2\", type=str)
#subparser for file_list
file_list_sp = args.add_subparsers()
file_list_parser = file_list_sp.ad_parser(\"-file_list\")
file_list_parser.add_argument(\"file_list\")
all_args = args.parse_args()
也许我需要为默认情况创建一个单独的子解析器;但所有子解析器似乎都需要一个额外的命令来调用它们。我希望在未传递 -file_list 时自动调用默认情况
-
-fil_list不是有效的子解析器名称。当使用子解析器时,很难有一个 \'default\' 的情况。您需要为每个备选方案定义一个子解析器。在尝试做一些新奇的事情之前,先练习记录的风格。 -
@hpaulj 它可以是,如果你改变前缀字符。但你是对的,坚持既定的惯例比尝试不同的东西要好。 (我怀疑更改前缀字符的能力是为了允许复制现有界面,而不是鼓励命令行界面中的“创新”。)
-
@chepner您的怀疑确实是正确的。
script.py <file1> <file2>表单已存在。我需要添加一个新选项,用户可以在其中传递一个只有文件对列表的文件。因此,原始命令应继续按原样工作。 -
我认为没有任何好的基于
argparse的解决方案可以解决这个问题,除非手动重新实现大部分参数处理。子命令和普通的顶级位置参数并不能很好地配合使用。您可能能够为-file_list选项定义自定义操作,或对解析的参数进行后处理,但argparse(开箱即用)无法处理您想要实现的逻辑。 -
仍然需要 2 个位置。
subparsers是另一个位置。