[英]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.