Значения по умолчанию не работают с присутствующими позиционными и необязательными аргументами - PullRequest
0 голосов
/ 23 апреля 2019

Мой код (train.py):

parser = argparse.ArgumentParser()

    parser.add_argument('data_dir')
    parser.add_argument('--save_dir', type = str, default = 'save_directory', help = 'Save checkpoint directory')
    parser.add_argument('--arch', type = str, default = 'VGG', help = 'Select architecture. Choose VGG or AlexNet')
    parser.add_argument('--learning_rate', type = float, default = '0.001', help = 'Select the model learning rate')
    parser.add_argument('--hidden_units', type = int, default = '1024', help = 'Select the model hidden units')
    parser.add_argument('--epochs', type = int, default = '2', help = 'Select the number of epochs')
    parser.add_argument('--gpu', type = str, default = 'gpu', help = 'Select the device type. CPU or GPU.')

    return parser.parse_args()

Когда я пытаюсь запустить

python train.py data_dir --arch

Я получаю

train.py: ошибка: аргумент --arch: ожидается один аргумент

Почему мои значения по умолчанию не работают?

Ответы [ 2 ]

2 голосов
/ 23 апреля 2019

Значения по умолчанию подставляются, когда соответствующий аргумент отсутствует .

Вы определили --arch как «необязательный аргумент, который принимает строковые значения, и если он отсутствует, он должен быть VGG»

Если вы передадите --arch, оно должно иметь строковое значение. Если вы не сдадите --arch, это будет VGG.

Вы пробовали что-то промежуточное. Это ошибка.

2 голосов
/ 23 апреля 2019

Вы можете передать аргумент '--arch' тремя способами:

  1. Совсем нет, что будет использовать значение из default.
  2. Только с '--arch', который будет использовать значение из const. Поскольку const изначально не был указан, по умолчанию это значение равно None, что делает его таким же, как и в первом случае.
  3. С '--arch <value>', который будет использовать <value>.

Следовательно, вам нужно указать, что флаг принимает дополнительный необязательный аргумент с nargs='?' и значением const:

parser.add_argument('--arch',
                    nargs='?', 
                    type=str, 
                    const='VGG',
                    default='VGG',
                    help='Select architecture. Choose VGG or AlexNet')

Вы также можете отметить, что вы можете передать choices=['VGG', 'AlexNet'], чтобы ограничить доступные варианты выбора (возникнет ошибка, если аргумент не находится в choices).

...