Как динамически добавлять опции в optparser? - PullRequest
1 голос
/ 01 августа 2011

У меня есть система, где вы можете изменить, какие модули будут загружаться (и запускаться; «модуль» не обязательно является модулем Python, он может объединять несколько модулей).Программа может запускать модули A и B. Теперь я хочу иметь возможность, чтобы каждый модуль мог определять (добавлять) свои собственные параметры.Допустим, A хочет иметь -n, а B хочет иметь -s для чего-то.Но есть один общий параметр -c, который необходим основной системе.Каков наилучший способ добиться этого?

До сих пор я использовал один экземпляр optparse.OptionParser и передавал его каждому модулю, когда они инициализируются.Затем модуль может изменить (добавить новый параметр) при необходимости.

Ответы [ 2 ]

2 голосов
/ 01 августа 2011

Вам следует рассмотреть возможность перехода в библиотеку, которая поддерживает концепцию подпарсеров , таких как argparse (которая в любом случае не поддерживает optparse), чтобы каждая библиотека могла создать свой собственный анализатор правила, и основная программа может просто объединить их.

1 голос
/ 03 августа 2011

Когда у меня возникла эта проблема, я использовал класс, производный от 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.

Он не тестируется с расширенными функциями, такими как подпарсеры, и, вероятно, не будет работать там, но может быть легко расширен для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...