2016-10-29 34 views
7

Argparse'ı, seçimlerin açık bir listesi olan bir Python 3 uygulamasında kullanmaya çalışıyorum, ancak hiçbiri belirtilmemişse, varsayılan değerdir.python argparse seçimleri varsayılan seçenek

Ben kodudur:

parser.add_argument('--list', default='all', choices=['servers', 'storage', 'all'], help='list servers, storage, or both (default: %(default)s)') 
args = parser.parse_args() 
print(vars(args)) 

Ancak, ben bu çalıştırdığınızda ben bir seçenek şu olsun:

$ python3 ./myapp.py --list all 
{'list': 'all'} 

Ya bir seçenek olmadan:

$ python3 ./myapp.py --list 
usage: myapp.py [-h] [--list {servers,storage,all}] 
myapp.py: error: argument --list: expected one argument 

Burada bir şey mi eksik? Ya da belirtilen seçeneklerle bir varsayılan değere sahip olamaz mıyım?

+0

--list' hiç ve varsayılan olacaktır 'geçmek yok Kullanılmış. – ShadowRanger

+0

Anladım ... Bu listeye, oluşturmaya, silmeye vb. Anlatmam gerekmesi dışında işe yarar. – MVanOrder

+0

İstediğiniz gibi geliyor [subcommands] (https://docs.python.org/3/ kütüphane/argparse.html # alt komutlar), hiç bir anahtar değil. 'Nargiler' ile '-' bile, '--list' arasındaki farkı söyleyemezsiniz ve varsayılan bir ayar olduğunda hiçbir şeyi geçemezsiniz. – ShadowRanger

cevap

14

add_argument için nargs ve const argüman iletme:

parser.add_argument('--list', 
        default='all', 
        const='all', 
        nargs='?', 
        choices=['servers', 'storage', 'all'], 
        help='list servers, storage, or both (default: %(default)s)') 

Eğer --list bağımsız değişken olmadan kabul edildi olmadığını bilmek istiyorsanız, const argüman kaldırmak ve args.listNone olup olmadığını kontrol edin.

2

Teşekkürler @ShadowRanger. Subcommands tam olarak ihtiyacım olan şey, nargs ve const ile birlikte. Aşağıdaki çalışır: Tek başına

parser = argparse.ArgumentParser() 
subparser = parser.add_subparsers() 
parser_list = subparser.add_parser('list') 
parser_list.add_argument('list_type', default='all', const='all', nargs='?', choices=['all', 'servers', 'storage']) 

parser_create = subparser.add_parser('create') 
parser_create.add_argument('create_type', default='server', const='server', nargs='?', choices=['server', 'storage']) 

args = parser.parse_args() 
pprint(vars(args)) 

$ python3 ./myapp.py -h 
usage: dotool.py [-h] {list,create} ... 

Digital Ocean tool 

positional arguments: 
    {list,create} 

optional arguments: 
    -h, --help  show this help message and exit 

liste seçeneği: bir parametreye sahip

$ python3 ./myapp.py list 
{'list_type': 'all'} 

Liste seçeneği:

$ python3 ./myapp.py list servers 
{'list_type': 'servers'}