python - 对 argparse 参数解析器进行子类化

标签 python derived-class argparse

我正在尝试编写一个派生自 Python argparse ArgumentParser 类的解析器类。以下代码的概要在命令行上运行良好,但会产生一个错误,我在我的模块上下文中很难理解。

代码(精简了一点,去掉了不重要的东西)如下:

class SansParser(argparse.ArgumentParser):
"""Argument parser for preparing a SansModel fit or calculation

"""

def __init__(self):
    """Initialisation method for the parser class"""

    argparse.ArgumentParser.__init__(self)


    # Subparsers for the two commands 'calc' and 'fit'
    self.subparsers = self.add_subparsers()
    self.fit_parser = self.subparsers.add_parser('fit', help="Fit a dataset")
    self.fit_parser.add_argument('-d', '-data', '-dataset', type = str,
                                 dest = 'dataset',
                                 help = "The dataset to fit in SasXML format")
    self.fit_parser.set_defaults(func=fit)
    self.calc_parser = self.subparsers.add_parser('calc', prog='test')
    self.calc_parser.set_defaults(func=calculate)

我可以将其作为脚本运行,效果很好。如果我从 shell 运行它或导入 python 命令行并尝试实例化我得到的类:

$ python sansmodel.py
    Traceback (most recent call last):
    File "sansmodel.py", line 57, in <module>
      parser = SansParser()
    File "sansmodel.py", line 41, in __init__
      self.fit_parser = self.subparsers.add_parser('fit', help="Fit a dataset")
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/argparse.py",
    line 1064, in add_parser
      parser = self._parser_class(**kwargs)
 TypeError: __init__() got an unexpected keyword argument 'prog'

据我所知,argparse 本身的代码在第 1064 行明确创建了“prog”关键字,这是预期的行为,所以我对它在哪里出乎意料感到困惑。我猜我的示波器不知何故倒退了?

最佳答案

除非您要覆盖某些 argparse.ArgumentParser 行为,否则我建议创建一个解析器对象并将参数和子解析器添加到该对象。

就是说,问题在于当添加新的解析器时,__init__ 方法已被 SansParser 实现覆盖,不接受与原始的 ArgumentParser

这个问题的解决方法应该是:

self.subparsers._parser_class = argparse.ArgumentParser

这样,当 add_parser 被调用时,不是创建一个新的 SansParser(因为无限递归会失败),而是一个新的 ArgumentParser 将被创建。

关于python - 对 argparse 参数解析器进行子类化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8757338/

相关文章:

generics - typescript :从通用基类返回 "this"

C++ 从基类调用派生类函数

python - 在 python 的 argparse 模块中,如何禁用大括号之间的打印子命令选择?

python - argparse 其他参数隐含的子解析器

python - Node.js 从 stdin 读取时无法读取 python 子进程 stdout

android - 在 Windows 中将 MonkeyRunner 导入 Python 脚本失败

python - 为什么使用 Flask 的 app.test_client() 而不是 requests.Session() 进行测试

python - 递归函数返回值保留以前运行的结果

c# - 在 C# 中重铸为基类

python - argparse 添加示例用法