具有位置和可选参数的Argparse(具有值范围的位置)

时间:2014-03-24 04:01:54

标签: python argparse

我希望我的代码能够捕获一个位置" -y"和一个可选的" -tab" 对于前一个,它只取值1, 2, 3

这样我才能做到

mycode.py -tab -y 1
mycode.py -y1

or

mycode.py -tab -y 2
mycode.py -y2

or

mycode.py -tab -y 3
mycode.py -y3

如果我们给出3以外的值,就会引起错误。

在Python中使用它的方法是什么?

这是我的尝试:

# Setup argument paring
parser = argparse.ArgumentParser(description="Some description.")
parser.add_argument("-tab","--tabular", help="Some task", action="store_true")
parser.add_argument("-y","--yell", nargs=1, help="Type of fold change to show")
args = parser.parse_args()


tabular = False
type = 1
if args.tabular:
    tabular=True

if args.yell == 1:
    type = '1'
elif args.yell == 2:
    type = 2
elif args.yell == 3:
    type = 3
else:
    raise Exception('Incorrect type, max 3')

它有3个问题:

  1. 始终是type = 1
  2. 的值 如果我给了-y 4(或1,2,3以外),
  3. 永远不会引发错误。
  4. -y位于可选位置(应该是位置)
  5. 更新

    启用-y的位置参数,仍然无法正常工作。

    完整代码:

    #!/usr/bin/python
    # Python 2.7.
    import sys
    import argparse
    
    parser = argparse.ArgumentParser(description="Some description.")
    parser.add_argument("-tab","--tabular", help="Some task", action="store_true")
    parser.add_argument("-y", help="Type of fold change to show", choices=range(1,4), required=True, type=int)
    args = parser.parse_args()
    

    命令行:

    $ python mycode.py -h 
    usage: mycode.py [-h] [-tab] [-y {1,2,3}]
    
    Some description.
    
    optional arguments:
      -h, --help       show this help message and exit
      -tab, --tabular  Some task
      -y {1,2,3}       Type of fold change to show
    

    我的预期结果:

    $ python mycode.py -h 
    usage: mycode.py [-h] [-tab] [-y {1,2,3}]
    
    Some description.
    
    positional arguments:
    -y {1,2,3}       Type of fold change to show    
    
    optional arguments:
    -h, --help       show this help message and exit
    -tab, --tabular  Some task
    

    按ENTER或键入命令继续

1 个答案:

答案 0 :(得分:1)

一般事项:

请勿使用is来比较数字相等,请使用==

可选的命令行参数应该有两个破折号。同样,位置参数应该以两个破折号为前缀。


当您add_argument时,您可以指定choices kwarg。

parser.add_argument("-y","--yell", help="Type of fold change to show", choices=range(1,4), type=int)

如果在1到3之外指定-y,则会抱怨。我添加了type=int指令,以便args.yell成为int而不是字符串。

注意我离开了nargs=1 kwarg。指定nargs=1表示args.yell 是包含一个元素的列表,而不是int。这是代码中错误的来源:[1]不等于1