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