【问题标题】:argparse, subcommands, and inheritanceargparse、子命令和继承
【发布时间】:2018-12-30 01:51:39
【问题描述】:

我使用argparse (Python 3) 来执行其中一个子命令。

我想初始化一个依赖于所选子命令的类的类实例。 (但是,所有这些类都有一个公共基类,其中包含所有子命令通用的字段。)

例如对于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()

【问题讨论】:

  • 您的示例代码既不是很简洁也不是很有说明性。
  • 目前我想到的唯一解决方案是首先运行args = parser.parse_args(),然后才创建并初始化类实例
  • argparse 不调用任何构造函数,它只是解析输入并返回 args 命名空间中的值。我建议打印那个。使用args.title 确定chain 是选择,然后像往常一样调用构造函数。

标签: python python-3.x inheritance argparse


【解决方案1】:

在处理任何参数之前不可能初始化类实例,因为参数在用户提供的命令中按顺序排列。

剩下的唯一解决方案是首先解析所有 args,然后才使用 args = parser.parse_args() 生成的已解析 args 初始化类实例。

【讨论】:

  • 这非常模糊,不太可能对未来的读者有用。
猜你喜欢
  • 2015-05-07
  • 2012-01-29
  • 2018-12-03
  • 2020-01-14
  • 2017-01-31
  • 2014-10-09
  • 2021-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多