我使用argparse (Python3)执行其中一个子命令。
我希望初始化依赖于所选子命令的类的类实例。(但是,所有这些类都有一个公共基类,其中包含所有子命令的公共字段。)
例如,对于chain子命令,我希望在TransformationAutomaticWorkflowElementOptions类的对象中填充值。
问题:根据用户的子命令创建正确类型的对象的好方法是什么?然后,如何填充它的字段(基类的公共字段(请参阅所有子解析器的公共选项)和这个特定派生类的特殊字段)?
问题是在处理所有其他选项之前,调用由特定子命令确定的构造函数。
下面是一个(几乎)真实的代码:
#!/usr/bin/env python
import argparse
parser = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter,
description="Automatically process XML.")
subparsers = parser.add_subparsers(title='subcommands')
parser.add_argument('-p', '--preload', help='preload asset', action='append', metavar='NAMESPACE')
parser.add_argument('-r', '--recursive', help='recursive download mode (none, breadth-first, depth-first)',
choices=['none', 'breadth', 'depth'])
parser.add_argument('-x', '--recursive-order', metavar='ORDER',
help='recursive download order (comma separated "sources", "targets", "workflowtargets")')
parser.add_argument('-d', '--downloaders', metavar='DOWNLOADERS',
help='a plus-separated list of comma-separated lists of "builtin","ns"')
chain_parser = subparsers.add_parser('chain', aliases=['c'], help='Automatically run a chain of transformations')
chain_parser.add_argument('source', nargs='?', help='source document (defaults to stdin)')
chain_parser.add_argument('-o', '--output', nargs=1, help='output file (defaults to stdout)')
chain_parser.add_argument('-t', '--target', help='target namespace(s)', action='append', metavar='NAMESPACE')
chain_parser.add_argument('-n', '--not-in-target', help='what if a result is not in target NS',
choices=['ignore', 'remove', 'error'])
chain_parser.add_argument('-u', '--universal-precedence', help='universal precedence', metavar='URL')
args = parser.parse_args()发布于 2018-07-22 13:00:06
在处理任何参数之前不可能初始化类实例,因为参数按照用户提供的命令的顺序排列。
剩下的唯一解决方案是首先解析所有的args,然后使用由args生成的已解析的args = parser.parse_args()初始化类实例。
https://stackoverflow.com/questions/51464763
复制相似问题