使用可变关键字作为可选参数名称和 python argparse

using a variable keyword for an optional argument name with python argparse

我正在为我正在编写的 python 脚本使用 argparse。该脚本的目的是处理存储表格数据的大型 ascii 文件。该脚本只是为我编写的 class 提供了一个方便的前端,它允许对表格数据进行任意数量的即时切割。在 class 中,用户可以传入一个变量名关键字参数,其中包含一个绑定到该变量的二元组。该元组定义了名称与变量名关键字相对应的任何列的下限和上限。例如:

reader = AsciiFileReducer(fname, mass = (100, float("inf")), spin = (0.5, 1))

reader 实例随后将忽略输入 fname 的所有行,但具有 mass 的行除外> 1000.5 < 自旋 < 1。输入 fname 可能有许多其他列,但只有 massspin 会被削减.

我希望我正在编写的脚本保留此功能,但我不知道如何允许使用 argparse.add_argument 添加带有变量名的参数。我的 class 允许任意数量的可选参数,每个参数都有未指定的名称,其中为名称选择的字符串本身是有意义的。 python 的 **kwargs 特性使这成为可能。 argparse 可以吗?

如果我不明白你想要做什么,请提前致歉。但是根据你的描述,如果我正在实施这个,我可能会尝试类似下面的事情。在这里,我制作了质量和自旋可选输入并设置了它们的默认值,因此唯一需要的输入是文件名。

示例代码:

# q.py test code

import argparse

parser = argparse.ArgumentParser(prog='q.py')
parser.add_argument('file', help='filename')
parser.add_argument('-m', default=100, type=int, help='integer mass value')
parser.add_argument('-s', nargs=2, default=[0.5,1.0], type=float, help='spin values without comma')

args=parser.parse_args()

print('file:', args.file)
print('mass:', args.m)
print('spin:', tuple(args.s))

一些命令行调用:

$ python q.py -h
usage: q.py [-h] [-m M] [-s S S] file

positional arguments:
file        filename

optional arguments:
-h, --help  show this help message and exit
-m M        integer mass value
-s S S      spin values without comma

$ python q.py test.csv
file: test.csv
mass: 100
spin: (0.5, 1.0)

$ python q.py test.csv -m 99 -s 0.2 1.1
file: test.csv
mass: 99
spin: (0.2, 1.1)

而且我认为您可以像这样调用初始化您的 reader:

reader = AsciiFileReducer(args.file, mass = (args.m, float("inf")), spin = tuple(args.s))

通过 argparse 接受任意 key:value 对的问题之前已经出现。例如:

这有几个很长的答案,带有指向早期问题的链接。

另一种选择是获取一个字符串并用 JSON 解析它。

但这里有一个基于 nargsappend 操作类型的快速选择:

parser=argparse.ArgumentParser()
parser.add_argument('-k','--kwarg',nargs=3,action='append')

一个示例输入,生成一个带有列表列表的命名空间:

args=parser.parse_args('-k mass 100 inf -k spin 0.5 1.0'.split())

Namespace(kwarg=[['mass', '100', 'inf'], ['spin', '0.5', '1.0']])

可以将它们转换为字典,表达式如下:

vargs={key:(float(v0),float(v1)) for key,v0,v1 in args.kwarg}

可以将其传递给您的函数:

foo(**vargs)
{'spin': (0.5, 1.0), 'mass': (100.0, inf)}