Как изменить PARSER_FORMATTER при использовании библиотеки argh Python

Используя библиотеку Argh для Python, я хочу предоставить другой PARSER_FORMATTER, когда я отправлю свою функцию с argh.dispatch_command,

Я старался:

import argh
import argparse

argh.PARSER_FORMATTER = argparse.RawTextHelpFormatter

def myfunct(arg, param=None):
    pass # here my working code

if __name__ == '__main__':
    argh.dispatch_command(myfunct)

Но когда вызывается с --help результирующая программа все еще выводит значения по умолчанию. Так что все еще, кажется, использовать Argh's CustomFormatterвместо аргпарса RawTextHelpFormatter Я стараюсь предоставить.

Странно, когда я использую set_default_command и предоставь парсер сам, все работает

import argh
import argparse

argh.PARSER_FORMATTER = argparse.RawTextHelpFormatter

def myfunct(arg, param=None):
    pass # here my working code

if __name__ == '__main__':
    parser = argparse.ArgumentParser(
         formatter_class=argh.PARSER_FORMATTER)
    argh.set_default_command(parser, myfunct)
    argh.dispatch(parser)

Таким образом, проблема должна касаться внутренней видимости PARSER_FORMATTER в Argh. Как я могу изменить argh.PARSER_FORMATTER для самого модуля Argh, так что argh.dispatch_command использует это? Это должно быть возможно, или я здесь не на том пути?

2 ответа

Вы видите такое поведение, потому что Dispatching.py импортируетPARSER_FORMATTER константа в свое собственное пространство имен во время импорта, а затем функции dispatch_command и dispatch_commands обращаются к локальной константе , чтобы получить класс средства форматирования.

Чтобы достичь того, что вы хотите, библиотека должна будет сделать явный выбор для ссылки на значение вargh.constantsпространство имен. Иллюстрация . До тех пор, пока это не произойдет, может быть полезен следующий фрагмент кода:

      import argparse
import argh

# argh.PARSER_FORMATTER = argparse.RawTextHelpFormatter
argh.dispatching.PARSER_FORMATTER = argparse.RawTextHelpFormatter

def myfunct(arg, param=None):
    pass # here my working code

if __name__ == '__main__':
    argh.dispatch_command(myfunct)

Обезьянье исправление внешних библиотек не рекомендуется, потому что это делает ваш код ненадежным.argh.ArghParserявляется подклассомArgumentParser, поэтому вы можете просто передать свою константу ее конструктору.

Другие вопросы по тегам