使用argparse读取默认参数

时间:2014-08-16 22:40:27

标签: python argparse

在argparse中使用类似的东西时:

parser.add_argument("-option1", type=int, nargs=1, default=1, choices=xrange(1, 10), help="option 1 message")

如果未传递参数,则args.option1为整数。如果传递参数,则args.option是一个列表。

这意味着我必须使用args.option1或args.option1 [0]。有可能避免这种情况吗?

2 个答案:

答案 0 :(得分:2)

如果将nargs设置为整数,则参数在指定时始终为列表。您可以使用'?'将其设置为单个值默认值:

parser.add_argument(
    "-option1", type=int, nargs='?', default=1, 
    choices=xrange(1, 10), help="option 1 message")

来自nargs documentation

  
      
  • N(整数)。命令行中的N个参数将聚集到一个列表中。
  •   
     

[...]

     
      
  • '?'。如果可能,将从命令行使用一个参数,并将作为单个项生成。如果不存在命令行参数,则将生成默认值。
  •   

强调我的。您可能也希望设置const,以防有人在命令行上使用 -option1而后面没有值;如果没有const,则该值将设置为None。只需将其设置为与默认值相同的值:

parser.add_argument(
    "-option1", type=int, nargs='?', default=1, const=1,
    choices=xrange(1, 10), help="option 1 message")

另一种选择是设置nargs

parser.add_argument(
    "-option1", type=int, default=1, 
    choices=xrange(1, 10), help="option 1 message")

这通常意味着几乎nargs='?'相同:

  

如果未提供nargs关键字参数,则消耗的参数数由操作确定。 通常这意味着将使用单个命令行参数,并且将生成单个项目(不是列表)。

不同之处在于不允许命令行上的 -option1参数;不需要设置const

演示:

>>> from argparse import ArgumentParser
>>> parser = ArgumentParser()
>>> parser.add_argument(
...     "-option1", type=int, nargs='?', default=1, const=1,
...     choices=xrange(1, 10), help="option 1 message")
_StoreAction(option_strings=['-option1'], dest='option1', nargs='?', const=1, default=1, type=<type 'int'>, choices=xrange(1, 10), help='option 1 message', metavar=None)
>>> parser.parse_args(['-option1', '4'])  # option with argument
Namespace(option1=4)
>>> parser.parse_args(['-option1'])       # option with *no* argument
Namespace(option1=1)
>>> parser.parse_args([])                 # option not specified
Namespace(option1=1)
>>> parser = ArgumentParser()
>>> parser.add_argument(
...     "-option1", type=int, default=1, 
...     choices=xrange(1, 10), help="option 1 message")
_StoreAction(option_strings=['-option1'], dest='option1', nargs=None, const=None, default=1, type=<type 'int'>, choices=xrange(1, 10), help='option 1 message', metavar=None)
>>> parser.parse_args(['-option1', '4'])  # option with argument
Namespace(option1=4)
>>> parser.parse_args([])                 # option not specified
Namespace(option1=1)
>>> parser.parse_args(['-option1'])       # option with *no* argument
usage: [-h] [-option1 {1,2,3,4,5,6,7,8,9}]
: error: argument -option1: expected one argument

答案 1 :(得分:1)

您获得了一个列表,因为您在nargs=1的参数中设置了add_argumentthe docs

中也概述了这一点
  

请注意nargs=1会生成一个项目的列表。这与默认情况不同,在默认情况下,项目由其自身生成。

如果删除nargs=1,它应该根据需要自行生成项目(如果给出参数,则来自default)。如果您希望将数字设为可选(即允许-option1不带参数),请使用nargs='?'并将const设置为该情况的默认值。