在某些情况下,让python argparse仅使用部分默认值

在某些情况下,让python argparse仅使用部分默认值,python,argparse,Python,Argparse,如果从控制台/shell调用脚本时,要将非int或非float值作为参数提供给脚本,是否有任何简单的方法可以让它返回相应的默认值 import argparse def check(v): try: return float(v) except: #return default value for respective index in default list parser = argparse.ArgumentParser() parse

如果从控制台/shell调用脚本时,要将非int或非float值作为参数提供给脚本,是否有任何简单的方法可以让它返回相应的默认值

import argparse

def check(v):
    try:
        return float(v)
    except:
        #return default value for respective index in default list

parser = argparse.ArgumentParser()

parser.add_argument('-data',dest='data', type = check, nargs=5,
                    default=[-1,1,-7.9,512,0])
data = args.data
print(data)
例如,如果提供了以下参数:

file.py -data 1 6.03 1 p 1

我只希望替换
p
,这样
数据将打印
[1,6.03,1,512,1]
。谢谢。

我认为最好的方法是将5的参数分成5个不同的参数,-data1--data2(甚至为每个数据点提供更好的描述性名称),因为现在它是位置性的,所以很难判断哪个参数没有填写。 您也可以像您在示例中那样传递一个伪值,如“p”,然后当您解析参数时,您可以用预设默认值替换它们


my_data=[default[i]if x='p'else x for i,x in enumerate(data)]

我认为最好的方法是将5的参数分为5个不同的参数,-data1--data2(甚至为每个数据点提供更好的描述性名称),因为现在它是位置性的,所以很难判断哪个参数没有填入。 您也可以像您在示例中那样传递一个伪值,如“p”,然后当您解析参数时,您可以用预设默认值替换它们


my_data=[默认值[i]如果x='p'else x表示枚举(数据)中的i,x)]

您可以在
type
检查中提出
ValueError
,然后使用
sys.argv
获取所有参数,用非浮点/非整数值获取arg的索引,并用该索引处的默认值替换<代码>默认值
是列表中带有默认值的dict

import argparse
import sys

def check(v):
    try:
        value = float(v)
        return value
    except ValueError:     #raise ValueError if the arg is not int           
        defaults = vars(parser.parse_args([]))   #get all the default values as a dict
        args = sys.argv[2:]         #exclude args at 0 and 1 index
        v_index = args.index(v)     #grab index at v              
        v = defaults['data'][v_index]  #assign the default value at v's index to 'v'
        return v

parser = argparse.ArgumentParser()
parser.add_argument('-data', dest='data',type = check, nargs=5, default=[-1,1,-7.9,512,0]) 
args = parser.parse_args() 
print(args.data)
现在让我们用您提供的参数来测试这一点。我的文件名为test.py:

python test.py -data 1 6.03 1 p 1
#Output:
[1.0, 6.03, 1.0, 512, 1.0]
让我们向混合中添加另一个非整型/非浮点型参数:

python test.py -data 1 6.03 x p 1
#Output:
[1.0, 6.03, -7.9, 512, 1.0]
编辑:以下是一个通用解决方案,与提供的标志(“-data”,“-name”)无关:


您可以在
键入
检查时引发
ValueError
,然后使用
sys.argv
获取所有参数,用非浮点/非整数值获取arg的索引,并用该索引处的默认值替换<代码>默认值
是列表中带有默认值的dict

import argparse
import sys

def check(v):
    try:
        value = float(v)
        return value
    except ValueError:     #raise ValueError if the arg is not int           
        defaults = vars(parser.parse_args([]))   #get all the default values as a dict
        args = sys.argv[2:]         #exclude args at 0 and 1 index
        v_index = args.index(v)     #grab index at v              
        v = defaults['data'][v_index]  #assign the default value at v's index to 'v'
        return v

parser = argparse.ArgumentParser()
parser.add_argument('-data', dest='data',type = check, nargs=5, default=[-1,1,-7.9,512,0]) 
args = parser.parse_args() 
print(args.data)
现在让我们用您提供的参数来测试这一点。我的文件名为test.py:

python test.py -data 1 6.03 1 p 1
#Output:
[1.0, 6.03, 1.0, 512, 1.0]
让我们向混合中添加另一个非整型/非浮点型参数:

python test.py -data 1 6.03 x p 1
#Output:
[1.0, 6.03, -7.9, 512, 1.0]
编辑:以下是一个通用解决方案,与提供的标志(“-data”,“-name”)无关:


问题是,
check
只获取当前字符串,而不是它在nargs 5中的位置。您是否尝试过在解析后编写函数来执行此替换?问题是,
check
只获取当前字符串,而不是它在nargs 5中的位置。您是否尝试过在解析后编写函数来执行此替换?那是最简单的地方了。谢谢你,这帮了大忙。还有一个问题。我还有3个可选的参数集(比如-color,-shape,-name),我也希望使用check(v)来检查它们。如果不使用4个check(v)函数,如何替换v=defaults['data'][v_index],使其使用“data”“color”“shape”“name”?似乎我只能输入一个参数来检查(v)以将其用作类型。如果您希望执行相同的类型检查替换默认值例程,则不需要单独的
检查(v)
函数。只需对每个参数使用相同的参数。如果这个答案是有帮助的,请投票/接受作为答案。我有点搞不懂你说的每个论点都是相同的。而且,现在我看得更多了,也许使用argparse无法真正解决我的问题。例如,我需要-data 1 y-name t1来将y和t都更改为各自的默认值(etc),我不确定如何仅根据-name之后/第一个可选参数之后的任何可选参数来查找索引。对于name,只需使用'name'键来获取默认值:v=defaults['name'][v_索引]。我将很快更新我的答案,这将解决所有参数。我相信我理解这一点,只是不完全确定如何识别/区分要使用的默认键。此外,对于-name t1示例,我需要用-name重新开始索引,否则我认为我无法获得正确的默认索引能够以任何顺序使用我的四个可选参数中的任意数量。非常感谢。还有一个问题。我还有三个可选参数集(比如-color,-shape,-name),我也想使用check(v)进行检查。如果不使用4个check(v)函数,我如何替换v=defaults['data'][v_index]所以它使用“数据”“颜色”“形状”“名称”?似乎我只能输入一个参数来检查(v)以将其用作类型。如果您希望执行相同的类型检查替换默认值例程,则不需要单独的
检查(v)
函数。只需对每个参数使用相同的参数。如果此答案有帮助,请向上投票/接受作为答案。我有点搞不清楚每个参数使用相同的参数是什么意思。而且,现在我进一步了解,使用argparse可能无法真正解决我的问题。例如,我需要-data 1 y-name t 1来更改两个y和t分别对应于它们各自的默认值(etc),我不确定如何仅根据-name/第一个可选参数之后的任何可选参数来查找索引。对于name,只需使用'name'键获取默认值:v=defaults['name'][v_index]。我将很快更新我的答案,这将解决所有参数。我相信我理解这一点,只是不完全确定如何识别/区分要使用的默认键。此外,对于-name t1示例,我需要重新开始索引-