将变量赋给多个argparse属性

时间:2016-08-17 22:39:50

标签: python namespaces argparse

我尝试根据属性列表中的位置分配多个参数属性。举个例子;

import argparse
import sys

def args_options:
    parser = argparse.ArgumentParser()
    parser.add_argument('-s', help='-s argument help', nargs=3)
    parser.add_argument('-k', help='-k argument help', nargs=3)
    arguments = parser.parse_args()

    return arguments

def assign_arg():
    args = args_options()

    if args.s or args.k:
        variable1 = args[1] # this is where I'm stuck as I know this won't work
        variable2 = args[2] # ^

从上面开始,我试图检查arg.s或arg.k是否为真,如果是,则将任一参数列表中的第二个和第三个属性分配给变量。

是否可以使用python执行此操作?或者我需要做什么;

if arg.s:
    variable1 = arg.s[1] 
    variable2 = arg.s[2]
elif arg.k:
    variable1 = arg.k[1] 
    variable2 = arg.k[2]     

以上方法可行,但我有很多选项/属性,因此代码可能会变长。想通过在多个参数选项列表中查找属性并将其分配给变量来询问是否有更高效的方法。

1 个答案:

答案 0 :(得分:0)

使用各种输入运行解析器,并查看结果:

In [108]: def args_options(argv=None):
     ...:     parser = argparse.ArgumentParser()
     ...:     parser.add_argument('-s', help='-s argument help', nargs=3)
     ...:     parser.add_argument('-k', help='-k argument help', nargs=3)
     ...:     arguments = parser.parse_args(argv)
     ...:     return arguments
     ...: 

没有参数 - args.kargs.s都是None

In [109]: args_options([])
Out[109]: Namespace(k=None, s=None)

使用-s和正确数量的参数,args.s是3个字符串的列表。

In [110]: args_options(['-s','1','2','3'])
Out[110]: Namespace(k=None, s=['1', '2', '3'])

-k没有参数 - 错误

In [111]: args_options(['-s','1','2','3', '-k'])
usage: ipython3 [-h] [-s S S S] [-k K K K]
ipython3: error: argument -k: expected 3 arguments
An exception has occurred, use %tb to see the full traceback.

SystemExit: 2



In [112]: args_options(['-s','1','2','3', '-k','4','5','6'])
Out[112]: Namespace(k=['4', '5', '6'], s=['1', '2', '3'])

k和s - 都是3个元素列表

我们可以做的测试示例:

In [113]: args=args_options(['-k','1','2','3'])
In [114]: args.s is None
Out[114]: True
In [115]: args.k is None
Out[115]: False
In [116]: a,b,c = args.k   # unpack to variables
In [117]: a
Out[117]: '1'
In [118]: b
Out[118]: '2'
In [119]: c
Out[119]: '3'

列表的索引访问也有效:args.k[2]

vars(args)args对象创建一个字典,但我认为这不会使访问变得更容易。

重要信息 - 打印args以查看解析器生成的内容。一次又一次地这样做,直到你明白它在做什么以及为什么。

您可以在制作

中为-k default=[]提供一个In [123]: args=args_options(['-s','1','2','3']) In [124]: args Out[124]: Namespace(k=[], s=['1', '2', '3'])
dest

您可以为两者定义parser.add_argument('-k', '--ko', dest='something', default=[], nargs=3) ,并以args属性中的值结束;

  this.sobotService .getRobots().then(ODataRobots => {
      this.zone.run(() => this.sobots = ODataRobots.data);          
  });