【问题标题】:assign variable to multiple argparse attributes将变量分配给多个 argparse 属性
【发布时间】:2016-12-24 17:48:50
【问题描述】:

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

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]     

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

【问题讨论】:

  • 您的选项不是互斥组,如果同时指定了-s-k 会怎样?
  • 似乎-s-k 的参数以相同的方式处理,将s/k 设为标志并单独处理参数不是更有意义吗?

标签: python namespaces argparse


【解决方案1】:

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

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,并最终得到 args 属性中的值;

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

【讨论】:

    猜你喜欢
    • 2021-12-02
    • 1970-01-01
    • 2018-11-05
    • 2021-09-20
    • 1970-01-01
    • 2019-12-03
    • 2019-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多