2016-10-19 31 views
0

我想知道如何给一个参数,当一个标志被给出时,可选的时候没有给出该标志?Python Argparse:当且仅当给出一个标志时,如何设置参数?

import argparse 


parser = argparse.ArgumentParser() 

parser.add_argument('-c', '--convert', action = 'store_true') 
parser.add_argument('-l', '--lookup', action = 'store_true') 
parser.add_argument('name', type = str) 

args = parser.parse_args() 

if args.name: 
    print(args.name) 
if args.convert: 
    print ("convert now!") 

例如,在上面的代码,我想name被需要,只有当-c中给出。当运行该程序只与-l,则有一个错误:

$ python3 test.py -l 
usage: test.py [-h] [-c] [-l] name 
test.py: error: the following arguments are required: name 

我曾尝试使用参数组的参数分为两组1. -cname; 2. -l,但它并没有真正的工作。

任何建议表示赞赏!

回答

1

​​没有任何东西可以直接做到这一点;但它可以以各种方式

parser.add_argument('-c', '--convert', action = 'store_true') 
parser.add_argument('-l', '--lookup', action = 'store_true') 
parser.add_argument('name', nargs='?', default='good default') 

这不是在任何情况下要求近似,但在-c的情况下,你既可以使用good default,或者您也可以解析后抱怨。

parser.add_argument('-c', '--convert') 
parser.add_argument('-l', '--lookup', nargs='?', default='adefault', const='aconst') 

在这种情况下,-c期待一个说法,你需要name。对于-l,参数是可选的。如果没有-l,则值为default;如果-l没有参数,则值为const。你甚至可以把-c-l放在一个互斥的组中。

没有一种机制需要几个参数一起去(即没有'互相需要组')。然而,子分析师沿着这条线工作。我需要说明子分析器如何在这里使用吗?

自定义操作类可以用来强制参数之间的某种交互,但通常在解析后实现这种事情更容易。记住​​允许你以任何顺序给出参数。因此,name的位置可以发生在-c之前或之后,或在-l-c等之间。

+0

感谢您的详细解释,它帮助了很多!我可以去我自己的学习subparsers :) –

2

这不是​​可以自己执行的东西。你可以做的是将name定义为可选的,然后在解析后检查是否符合约束条件。

import argparse 


parser = argparse.ArgumentParser() 

parser.add_argument('-c', '--convert', action='store_true') 
parser.add_argument('-l', '--lookup', action='store_true') 
parser.add_argument('name', nargs='?') 

args = parser.parse_args() 

# If args.name must be a non-empty string when given, 
# you can use 'not args.name' in place of 'args.name is None' 
if args.convert and args.name is None: 
    parser.error("<name> required with --convert") 

if args.name: 
    print(args.name) 
if args.convert: 
    print ("convert now!") 
+0

谢谢,现在明白了。在这里使用'parser.error'是很明智的! –

相关问题