我正在尝试编写一个派生自 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/