gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 21:12:28 25 4
gpt4 key购买 nike

如果从控制台/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,因此 data 将打印 [1, 6.03, 1, 512, 1]。谢谢。

最佳答案

您可以在 type 检查时引发 ValueError,然后使用 sys.argv 获取所有参数,使用非浮点/非整数值并替换为该索引处的默认值。 defaults 是一个字典,默认值位于列表中。

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'):

def check(v):
#<--same-->
except ValueError:
defaults = vars(parser.parse_args([]))
args = sys.argv[2:]
arg_spec = str(sys.argv[1][1:]) #get the flag specified, '-name' etc.
v_index = args.index(v) #grab index at v
v = defaults[arg_spec][v_index] #assign the default value at v's index to 'v'
return v

#add another flag to the arguments,
#identify the flag passed with sys.argv,
#convert the args passed into a dict,
#select the flag key to get its value(the args for the flag) from the dict

parser = argparse.ArgumentParser()
parser.add_argument('-data', dest='data',type = check, nargs=5, default=[-1,1,-7.9,512,0])
parser.add_argument('-name', dest='name',type = check, nargs=5, default=[5,20,606,81,15])
args = parser.parse_args()
arg_spec = sys.argv[1][1:]
args_dict = vars(args)
print("The flag you provided is: '{}'. The args are: {}".format(sys.argv[1], args_dict[arg_spec]))

一些测试:

python test.py -name 1 6.03 1 x 1
#Output:
The flag you provided is: '-name'. The args are: [1.0, 6.03, 1.0, 81, 1.0]

python test.py -data 1 6.03 1 x 1
#Output:
The flag you provided is: '-data'. The args are: [1.0, 6.03, 1.0, 512, 1.0]

关于python - 在某些情况下让 python argparse 仅使用部分默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54967917/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com