默认值不适用于存在的Positional和Optional参数

时间:2019-04-23 12:49:38

标签: python python-3.x argparse

我的代码(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 个答案:

答案 0 :(得分:2)

可以通过三种方式传递'--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中,则会引发错误)。

答案 1 :(得分:2)

当相应的参数不存在时,将替换默认值。

您已将--arch定义为“一个接受字符串值的可选参数,如果不存在,则应为VGG

如果您通过--arch,则它应该具有字符串值。如果您未通过--arch,它将为VGG

您已经尝试过一些。那是一个错误的情况。