使用可变关键字作为可选参数名称和 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 的行除外> 100 和 0.5 < 自旋 < 1。输入 fname 可能有许多其他列,但只有 mass 和 spin 会被削减.
我希望我正在编写的脚本保留此功能,但我不知道如何允许使用 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 解析它。
但这里有一个基于 nargs
和 append
操作类型的快速选择:
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)}
我正在为我正在编写的 python 脚本使用 argparse。该脚本的目的是处理存储表格数据的大型 ascii 文件。该脚本只是为我编写的 class 提供了一个方便的前端,它允许对表格数据进行任意数量的即时切割。在 class 中,用户可以传入一个变量名关键字参数,其中包含一个绑定到该变量的二元组。该元组定义了名称与变量名关键字相对应的任何列的下限和上限。例如:
reader = AsciiFileReducer(fname, mass = (100, float("inf")), spin = (0.5, 1))
此 reader 实例随后将忽略输入 fname 的所有行,但具有 mass 的行除外> 100 和 0.5 < 自旋 < 1。输入 fname 可能有许多其他列,但只有 mass 和 spin 会被削减.
我希望我正在编写的脚本保留此功能,但我不知道如何允许使用 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 解析它。
但这里有一个基于 nargs
和 append
操作类型的快速选择:
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)}