繁体   English   中英

Python argparse 从选项中选择一个列表

[英]Python argparse select a list from choices

您如何使用 argparse 提供一组选项中的参数列表。 例如,假设我想要这样的东西:

python sample.py --p1 ['a','b'] --p2 ['x','y']

其中p1只能是'a', 'b', 'c'列表中'x', 'y', 'z'任意一个或全部,而p2只能是'x', 'y', 'z'列表中'x', 'y', 'z'任意一个或全部

我找到了一种方法来获得你想要的行为,但语法与你所呈现的不同。 您必须使用唯一的参数名称/值对指定每个选项。 如果没问题,那么以下工作:

parser = argparse.ArgumentParser(prog='game.py')
parser.add_argument('--p1', choices=['a', 'b', 'c'], action='append')
args = parser.parse_args(['--p1', 'a', '--p1', 'b'])
print(args)

结果:

Namespace(p1=['a', 'b'])

但这适当地失败了:

parser = argparse.ArgumentParser(prog='game.py')
parser.add_argument('--p1', choices=['a', 'b', 'c'], action='append')
args = parser.parse_args(['--p1', 'a', '--p1', 'b', '--p1', 'x'])
print(args)

结果:

usage: game.py [-h] [--p1 {a,b,c}]
game.py: error: argument --p1: invalid choice: 'x' (choose from 'a', 'b', 'c')

我在文档中找不到任何内容表明 ArgumentParser 会将有效值列表作为参数值,而这正是您的版本所需要的。

使用带有choices nargs

In [1]: import argparse
In [2]: p = argparse.ArgumentParser()
In [3]: p.add_argument('-a',nargs='+', choices=['x','y','z'])
Out[3]: _StoreAction(option_strings=['-a'], dest='a', nargs='+', const=None, default=None, type=None, choices=['x', 'y', 'z'], help=None, metavar=None)

In [4]: p.parse_args('-a x y z x x'.split())
Out[4]: Namespace(a=['x', 'y', 'z', 'x', 'x'])

In [5]: p.parse_args('-a x y z w x'.split())
usage: ipython3 [-h] [-a {x,y,z} [{x,y,z} ...]]
ipython3: error: argument -a: invalid choice: 'w' (choose from 'x', 'y', 'z')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM