在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]。有可能避免这种情况吗?
答案 0 :(得分:2)
如果将nargs
设置为整数,则参数在指定时始终为列表。您可以使用'?'
将其设置为单个值或默认值:
parser.add_argument(
"-option1", type=int, nargs='?', default=1,
choices=xrange(1, 10), help="option 1 message")
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_argument
。 the docs:
请注意
nargs=1
会生成一个项目的列表。这与默认情况不同,在默认情况下,项目由其自身生成。
如果删除nargs=1
,它应该根据需要自行生成项目(如果给出参数,则来自default
)。如果您希望将数字设为可选(即允许-option1
不带参数),请使用nargs='?'
并将const
设置为该情况的默认值。