Когда у меня возникла эта проблема, я использовал класс, производный от ArgumentParser
, который добавил возможность регистрировать функции обратного вызова, которые будут выполняться после анализа аргументов:
import argparse
class ArgumentParser(argparse.ArgumentParser):
def __init__(self, *p, **kw):
super(ArgumentParser, self).__init__(*p, **kw)
self._reactions = []
def add_reaction(self, handler):
self._reactions.append(handler)
def parse_known_args(self, args=None, namespace=None):
(args, argv) = super(ArgumentParser, self).parse_known_args(args, namespace)
for reaction in self._reactions:
reaction(args)
return (args, argv)
Таким образом, объект парсера все еще должен быть передан всем модулям для регистрации их переключателей командной строки, но модули могут реагировать на переключатели «самостоятельно»:
def arguments_parsed(args):
if args.datafile:
load_stuff(args.datafile)
def add_arguments(ap):
ap.add_argument('--datafile',
help="Load additional input data")
ap.add_reaction(arguments_parsed)
Используется argparse
, но то же самое, вероятно, можно сделать с optparse
.
Он не тестируется с расширенными функциями, такими как подпарсеры, и, вероятно, не будет работать там, но может быть легко расширен для этого.