为了从外部解决这个问题 - 我有一个初始实现,它通过用 OptionParser 的子类替换 OptionParser 类并重载 parse_args 方法来修补 optparse 模块并公开一个新的 delay_parse_args 方法。我正在分享这个解决方案的片段,以防其他人发现它有用或可以对其进行改进。
optparse_patch.py
import optparse
def patch_opt_parser():
optparse.stashed_parsers = {}
class OptionParserEx(optparse.OptionParser):
def delayed_parse_args(self, callback):
optparse.stashed_parsers[self] = callback
def parse_args(self, args=None, values=None):
for parser, callback in getattr(optparse,"stashed_parsers").items():
# add all the option_list & option_groups from the individual
# parsers in stashed_parsers to `self`
for parser, callback in getattr(optparse,"stashed_parsers").items():
# update `parser` to inherit the option_lists and option_groups from
# self. then ....
_o, _a = optparse._OptionParser.parse_args( parser, args, values )
callback( _o, _a t)
return getattr(optparse,"_OptionParser").parse_args(self, args, values)
optparse._OptionParser = optparse.OptionParser
optparse.OptionParser = OptionParserEx
patch_opt_parser()
这允许子模块“存储”它们的预期选项,并在模块的客户端实际提供 OptionParser 并在其自己的 OptionParser 上调用 parse_args 方法时在稍后阶段评估命令行选项。这种用例的一个例子如下:
模块.py
import optparse_patch
import optparse
parser = optparse.OptionParser()
group = optparse.OptionGroup(parser, "module options")
group.add_option("-f", dest="flip", action="store_true")
parser.add_option_group(group)
def cli_callback ( opts, args ):
if opts.flip:
print "flip"
opts, args = parser.delayed_parse_args ( cli_callback )
主文件
import module
import optparse
myparser = optparse.OptionParser()
mygroup = optparse.OptionGroup(myparser, "main options")
mygroup.add_option("-j", dest="jump", action="store_true")
myparser.add_option_group(mygroup)
opts, args = myparser.parse_args()
if opts.jump:
print "jump"
调用程序 main.py 会产生以下输出:
python main.py --帮助
Usage: main.py [options]
Options:
-h, --help show this help message and exit
module options:
-f
main options:
-j
python main.py -j -f
flip
jump