将变量分配给多个 argparse 属性

assign variable to multiple argparse attributes

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

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]     

上面的方法可行,但我有很多 options/attributes 所以代码可能会变长。想问是否有办法通过在多个参数选项列表中找到属性并将其分配给变量来更有效地做到这一点。

运行各种输入的解析器,看看结果:

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=[],在 produce

In [123]: args=args_options(['-s','1','2','3'])
In [124]: args
Out[124]: Namespace(k=[], s=['1', '2', '3'])

您可以为两者定义一个 dest,并以 args 属性中的值结束;

parser.add_argument('-k', '--ko', dest='something', default=[], nargs=3)