Python Argparse и Kwargs: как правильно указать значения по умолчанию?

#python

#python

Вопрос:

Я следую рецепту, подобному этому:

script.py

 def foo(a=1, b=2, c=3, d=4):
    ...

parser = ArgumentParser()
parser.add_argument('--a', type=int, default=1)
parser.add_argument('--b', type=int, default=2)
parser.add_argument('--c', type=int, default=3)
parser.add_argument('--d', type=int, default=4)
args = parser.parse_args() # get arguments as Namespace object
kwargs = vars(args) # convert to dictionary
foo(**kwargs) # unpack dictionary into kwargs
 

Затем я запускаю его из командной строки, используя что-то вроде:

 python script.py --a 2 --c 5
 

чтобы при необходимости переопределить значения по умолчанию.

Аргументы по умолчанию в foo предоставляют пользователю подсказки по:

  • разумные значения по умолчанию
  • однако типы, которые мы ожидаем от аргументов, мы также получаем из parser.add_argument вызова.

Это нарушает DRY и может быть сложно поддерживать, когда у вас более 20 kwargs.


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

Комментарии:

1. Определите значения по умолчанию как константы? DEFAULT_A = 1 , Затем ссылайтесь DEFAULT_A на add_argument и foo() и т. Д.

2. Это самый питонический подход? Такие константы обычно определяются в их собственном файле?

3. Совместное использование значений по умолчанию в разных API (argparse — не единственный такой API) в одной и той же кодовой базе является общей темой. Где вы сохраняете значения по умолчанию, зависит от размера проекта, если это отдельный constants.py в пакете или непосредственно в модуле.

4. Не так переносимо и разборчиво, но вы можете использовать самоанализ объекта function для получения kwargs по умолчанию.

5. @MadPhysicist приятно знать, спасибо. Мартин, я, вероятно, сделаю то, что ты предложил.