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

use*_*317 9 python argparse

如何使用 argparse 从一组选择中提供参数列表。例如,假设我想要类似的东西:

python sample.py --p1 ['a','b'] --p2 ['x','y']
Run Code Online (Sandbox Code Playgroud)

其中p1只能是列表中的任何或全部'a', 'b', 'c'并且p2只能是列表中的任何或全部'x', 'y', 'z'

Ste*_*eve 10

我找到了一种获得您想要的行为的方法,但使用的语法与您提供的不同。您必须使用唯一的参数名称/值对来指定每个选择。如果没问题,则可以执行以下操作:

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)
Run Code Online (Sandbox Code Playgroud)

结果:

Namespace(p1=['a', 'b'])
Run Code Online (Sandbox Code Playgroud)

但这适当地失败了:

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)
Run Code Online (Sandbox Code Playgroud)

结果:

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

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