#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 приятно знать, спасибо. Мартин, я, вероятно, сделаю то, что ты предложил.