簡體   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