Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用变量关键字作为python argparse的可选参数名称_Python_Argparse - Fatal编程技术网

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

使用变量关键字作为python argparse的可选参数名称,python,argparse,Python,Argparse,我正在为我正在编写的python脚本使用argparse。该脚本的目的是处理存储表格数据的大型ascii文件。该脚本只是为我编写的类提供了一个方便的前端,该类允许对表格数据进行任意数量的动态剪切。在类中,用户可以传入一个变量名关键字参数,该参数带有一个绑定到该变量的两元素元组。元组在名称与variable name关键字对应的任何列上定义下限和上限。例如: reader = AsciiFileReducer(fname, mass = (100, float("inf")), spin = (0

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

reader = AsciiFileReducer(fname, mass = (100, float("inf")), spin = (0.5, 1))
然后,此读卡器实例将忽略输入fname的所有行,但质量>100和0.5<自旋<1的行除外。输入fname可能有许多其他列,但只有“质量”和“旋转”将在其上放置剪切


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

如果我不清楚您想要做什么,请提前道歉。但是根据你的描述,如果我实现了这个,我可能会尝试下面的方法。在这里,我将mass和spin作为可选输入,并设置它们的默认值,因此唯一需要的输入是文件名

示例代码:

# 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 = AsciiFileReducer(args.file, mass = (args.m, float("inf")), spin = tuple(args.s))

如果我不明白你到底想做什么,请提前道歉。但是根据你的描述,如果我实现了这个,我可能会尝试下面的方法。在这里,我将mass和spin作为可选输入,并设置它们的默认值,因此唯一需要的输入是文件名

示例代码:

# 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 = AsciiFileReducer(args.file, mass = (args.m, float("inf")), spin = tuple(args.s))

通过argparse接受任意键:值对的问题以前已经出现过。例如:

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

这有几个长长的答案,并链接到前面的问题

另一种选择是获取字符串并用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)}

通过argparse接受任意键:值对的问题以前已经出现过。例如:

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

这有几个长长的答案,并链接到前面的问题

另一种选择是获取字符串并用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)}

这取决于您希望如何指定命令行参数。那会是`-c“mass>100”-c“0.5-row\u cut\u min
-row\u cut\u max
,并设置nargs=2,那么第一个参数可以是列的字符串名,第二个参数可以是cut。我认为这就是我想要的行为,不是吗?事实上,我认为这不允许我想要的,因为它不允许-row_cut_min或-row_cut_max多次出现。所以我回到了绘图板上。可能的重叠取决于您希望如何指定命令行参数。那会是`-c“mass>100”-c“0.5-row\u cut\u min
-row\u cut\u max
,并设置nargs=2,那么第一个参数可以是列的字符串名,第二个参数可以是cut。我认为这是我想要的行为,不是吗?事实上,我认为这不允许我想要的,因为它不允许-row_cut_min或-row_cut_max多次出现。所以我回到了绘图板上。感谢可靠的水晶般清晰的答案,@hpaulj。不知道为什么我的搜索没有找到你之前给出的答案。这就直接解决了我的问题。谢谢你的回答,@hpaulj。不知道为什么我的搜索没有找到你之前给出的答案。这直接解决了我的问题。谢谢你的插话,史蒂夫,我想我的问题措辞可能不够清楚。问题是我需要避免对论点的名称做出明确的声明。谢谢你的插话,史蒂夫,我想我的问题措辞可能不够清楚。问题是我需要避免对参数名称进行显式声明。