Python: есть ли эквивалент logging.getLogger (__name__) для парсеров argparse для передачи аргументов между модулями? - PullRequest
0 голосов
/ 10 апреля 2020

Библиотека журналов позволяет нам определить глобальный регистратор, к которому можно получить доступ из любых импортированных модулей, например:

main_script.py:

import logging
import module.py

if __name__ == "__main__":
    logging.config.fileConfig('/path/to/logging.conf')
    main(sys.argv[1:])

И затем в module.py :

import logging
logger = logging.getLogger(__name__)

Это здорово, так как это означает, что нет необходимости передавать многословные или отладочные флаги между модулями.

Я бы подумал, что для argparse существует нечто эквивалентное, например синтаксический анализ в основном сценарии или в отдельном модуле, а затем предоставление доступа к ним из любого другого модуля. В конце концов, sys.argv доступен из любого модуля, но кажется нелепым воссоздавать новый анализатор в каждом модуле только для доступа к ним; и альтернативой является передача аргументов в вызовах функций.

Я что-то упускаю здесь очевидное?

Заранее спасибо!

1 Ответ

0 голосов
/ 10 апреля 2020

logging отслеживает регистраторы в своем пространстве имен модуля. Поскольку logging.logger работает в этом пространстве имен, ему легко найти нужный регистратор. argparse этого не делает, но вы можете реализовать ту же функциональность в ваших собственных модулях. Создайте модуль, который каждый может импортировать, и сделайте так, чтобы он разбирал аргументы за вас. Первый вызов вызывает синтаксический анализ аргумента, а остальные просто получают результат.

myconfig.py

import sys
import argparse

args = None

def get_args(argv=sys.argv):
    global args
    if args is None:
        parser = argparse.ArgumentParser(description='Foo The Bar')
        # todo: add arguments…
        args = parser.parse_args(argv)
    return args

Скорее всего, кто-то хочет вызвать get_args на ранней стадии обработки основного сценария в в случае ошибки или, возможно, все, что хотел вызывающий абонент, был --help.

...