gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 22:03:37 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com