如何使 argparse 解析器也用作子解析器
How to make argparse parsers also function as subparsers
假设我已经定义了一些解析器:
foo_parser = argparse.ArgumentParser()
foo_parser.add_argument('-f')
bar_parser = argparse.ArgumentParser()
bar_parser.add_argument('-b')
现在我希望这些解析器显示为子解析器。
parser = argparse.ArgumentParser(prog='parent')
subparsers = parser.add_subparsers()
subparsers.add_parser('foo') # how can I associate these subparsers
subparsers.add_parser('bar') # with my foo and bar parsers already defined?
我知道我可以通过重复所有 add_argument 调用来做到这一点,但我希望有一个 DRY 解决方案。
argparse 是否允许这样做,还是我必须重新定义我的子解析器?
我问的原因是我有一组我不想胡闹的独立脚本,但我也想通过 sub-commands 提供一个统一的界面。我想从每个独立脚本中导入解析器,并使它们在统一界面中充当子解析器。
你试过parents
机制吗?这是一种使用来自另一个解析器的参数(和组)填充新解析器(包括子解析器)的方法。有些人甚至将其用作向多个子解析器添加参数子集的方法。它通过引用复制参数(Action 对象)。通常这可以正常工作,但它对自定义参数施加了限制。
https://docs.python.org/3/library/argparse.html#parents
==================
使用此方法创建子解析器:
class _SubParsersAction(Action):
def add_parser(self, name, **kwargs):
....
parser = self._parser_class(**kwargs)
....
return parser
理论上,它可以被定制为与您预定义的解析器一起工作,而不是创建一个新的解析器。调试这样的更改可能需要半个小时。
假设我已经定义了一些解析器:
foo_parser = argparse.ArgumentParser()
foo_parser.add_argument('-f')
bar_parser = argparse.ArgumentParser()
bar_parser.add_argument('-b')
现在我希望这些解析器显示为子解析器。
parser = argparse.ArgumentParser(prog='parent')
subparsers = parser.add_subparsers()
subparsers.add_parser('foo') # how can I associate these subparsers
subparsers.add_parser('bar') # with my foo and bar parsers already defined?
我知道我可以通过重复所有 add_argument 调用来做到这一点,但我希望有一个 DRY 解决方案。
argparse 是否允许这样做,还是我必须重新定义我的子解析器?
我问的原因是我有一组我不想胡闹的独立脚本,但我也想通过 sub-commands 提供一个统一的界面。我想从每个独立脚本中导入解析器,并使它们在统一界面中充当子解析器。
你试过parents
机制吗?这是一种使用来自另一个解析器的参数(和组)填充新解析器(包括子解析器)的方法。有些人甚至将其用作向多个子解析器添加参数子集的方法。它通过引用复制参数(Action 对象)。通常这可以正常工作,但它对自定义参数施加了限制。
https://docs.python.org/3/library/argparse.html#parents
==================
使用此方法创建子解析器:
class _SubParsersAction(Action):
def add_parser(self, name, **kwargs):
....
parser = self._parser_class(**kwargs)
....
return parser
理论上,它可以被定制为与您预定义的解析器一起工作,而不是创建一个新的解析器。调试这样的更改可能需要半个小时。