Python argparse-如何使用kwargs或argv传递给方法
我一直在寻找将Python argparse-如何使用kwargs或argv传递给方法,python,parameter-passing,argparse,argv,keyword-argument,Python,Parameter Passing,Argparse,Argv,Keyword Argument,我一直在寻找将**kwargs或*argv与argparse一起使用的方法。我将从硬代码到动态代码 """change Default params with AddSpecific""" def add_Specific(tmp_template,paraName,*params): jobCreator = job.JobCreator() #jobCreator.addSpecific('temp0', 0.1,0.2,0.3,0.4,....,0.7,...)
**kwargs
或*argv
与argparse
一起使用的方法。我将从硬代码到动态代码
"""change Default params with AddSpecific"""
def add_Specific(tmp_template,paraName,*params):
jobCreator = job.JobCreator()
#jobCreator.addSpecific('temp0', 0.1,0.2,0.3,0.4,....,0.7,...)
jobCreator.addRange(paraName, params)
# all other params will take defaults
jobs = jobCreator.generateJobs(tmp_template)
return jobs
这是我的硬代码和一个我将如何使用它的示例
def get_parser():
parser = argparse.ArgumentParser()
parser.add_argument("-r",
"--range",
dest="r",
nargs=8,
help="AddRange Parameters")
parser.add_argument("-p",
"--parameters",
dest="p",
nargs=8,
help="SetDefaults as Parameters")
parser.add_argument("-r",
"--range",
dest="r",
nargs=8,
help="AddRange Parameters")
return parser
"""Create a Template for a Job"""
def create_Template(temp3_,temp_tournsize,temp_popsize,temp0_,temp1_,temp_ngen,temp_run,tmpverb):
#single GA job
logging.basicConfig(level=logging.DEBUG)
template = job.JobTemplate(runGASimple)
print tmpverb
template.setDefaults(temp3=temp3_, tournsize=temp_tournsize, popSize=temp_popsize, temp0=temp0_, temp1=temp1_, ngen=temp_ngen, number_of_runs=temp_run, verbose=tmpverb)
return template
"""Run a simple Job"""
def ajob_run(template):
ajob = job.Job(template)
ajob.run()
pass
"""change Default params with AddRange"""
def add_Range(var_temp0,var_start,var_end,var_stepSize,var_temp1,var_start2,var_end2,var_stepSize2,tmp_template):
jobCreator = job.JobCreator()
#jobCreator.addRange('temp0', start=0.0, end=1.0, stepSize=0.1)
jobCreator.addRange(var_temp0, start= var_start, end=var_end, stepSize=var_stepSize)
#jobCreator.addRange('temp1', start=0.0, end=1.0, stepSize=0.1)
jobCreator.addRange(var_temp1, start=var_start2, end=var_end2, stepSize=var_stepSize2)
# all other params will take defaults
jobs = jobCreator.generateJobs(tmp_template)
return jobs
"""Create a Batchjob from Jobs"""
def batch_Job(tmp_jobs):
batchJob = job.BatchJob(tmp_jobs, 5)
return batchJob
if (__name__ == "__main__"):
args = get_parser().parse_args()
if (args.p and args.r):
print 'AddRange with Parameters Input Start:'
temp = create_Template(float(args.p[0]),int(args.p[1]),int(args.p[2]),float(args.p[3]),float(args.p[4]),int(args.p[5]),int(args.p[6]),ast.literal_eval(args.p[7]))
tmpjobs = add_Range(args.r[0],float(args.r[1]),float(args.r[2]),float(args.r[3]),args.r[4],float(args.r[5]),float(args.r[6]),float(args.r[7]),temp)
results = batch_Job(tmpjobs)
print 'AddRange with Parameters Input Ende.'
elif (args.p):
print 'Parameters Input Start:'
ajob_run(create_Template(
float(args.p[0]),
int(args.p[1]),
int(args.p[2]),
float(args.p[3]),
float(args.p[4]),
int(args.p[5]),
int(args.p[6]),
ast.literal_eval(args.p[7])))
print 'Parameters Input Ende.'
"""change Default params with AddSpecific"""
def add_Specific(tmp_template,paraName,*params):
jobCreator = job.JobCreator()
#jobCreator.addSpecific('temp0', 0.1,0.2,0.3,0.4,....,0.7,...)
jobCreator.addRange(paraName, params)
# all other params will take defaults
jobs = jobCreator.generateJobs(tmp_template)
return jobs
"""change Default params with AddSpecific"""
def add_Specific(tmp_template,paraName,*params):
jobCreator = job.JobCreator()
#jobCreator.addSpecific('temp0', 0.1,0.2,0.3,0.4,....,0.7,...)
jobCreator.addRange(paraName, params)
# all other params will take defaults
jobs = jobCreator.generateJobs(tmp_template)
return jobs
然后是一个很长的输出,带有一个框架的结果
"""change Default params with AddSpecific"""
def add_Specific(tmp_template,paraName,*params):
jobCreator = job.JobCreator()
#jobCreator.addSpecific('temp0', 0.1,0.2,0.3,0.4,....,0.7,...)
jobCreator.addRange(paraName, params)
# all other params will take defaults
jobs = jobCreator.generateJobs(tmp_template)
return jobs
我的方法预料到了这一点。变量名将来可以更改
template.setDefaults(mux=0.8, tournsize=20, rangeSize=20, temp0=0.5, temp1=0.5, ngen=20, number_of_runs=1, verbose=False)
jobCreator.addRange('temp0', start=0.0, end=1.0, tournStep=0.1)
jobCreator.addRange('temp1', start=0.0, end=1.0, turns=4)
"""change Default params with AddSpecific"""
def add_Specific(tmp_template,paraName,*params):
jobCreator = job.JobCreator()
#jobCreator.addSpecific('temp0', 0.1,0.2,0.3,0.4,....,0.7,...)
jobCreator.addRange(paraName, params)
# all other params will take defaults
jobs = jobCreator.generateJobs(tmp_template)
return jobs
将按如下方式进行更改:
setDefaults(**kwargs)
addRange(paraName,**kwargs)
"""change Default params with AddSpecific"""
def add_Specific(tmp_template,paraName,*params):
jobCreator = job.JobCreator()
#jobCreator.addSpecific('temp0', 0.1,0.2,0.3,0.4,....,0.7,...)
jobCreator.addRange(paraName, params)
# all other params will take defaults
jobs = jobCreator.generateJobs(tmp_template)
return jobs
我期望:
CLI.py -p temp0=1 temp1=0.4 ....temp6=8 ... -r temp0 start=0 end=1 tournStep=0.1
or
CLI.py -p hn0=1 bn1=0.4 ....tp6=8 ... -r temp1 start=0 end=1 turns=4
"""change Default params with AddSpecific"""
def add_Specific(tmp_template,paraName,*params):
jobCreator = job.JobCreator()
#jobCreator.addSpecific('temp0', 0.1,0.2,0.3,0.4,....,0.7,...)
jobCreator.addRange(paraName, params)
# all other params will take defaults
jobs = jobCreator.generateJobs(tmp_template)
return jobs
然后将带有输入的变量名称转换为:
setDefaults()
"""change Default params with AddSpecific"""
def add_Specific(tmp_template,paraName,*params):
jobCreator = job.JobCreator()
#jobCreator.addSpecific('temp0', 0.1,0.2,0.3,0.4,....,0.7,...)
jobCreator.addRange(paraName, params)
# all other params will take defaults
jobs = jobCreator.generateJobs(tmp_template)
return jobs
及
"""change Default params with AddSpecific"""
def add_Specific(tmp_template,paraName,*params):
jobCreator = job.JobCreator()
#jobCreator.addSpecific('temp0', 0.1,0.2,0.3,0.4,....,0.7,...)
jobCreator.addRange(paraName, params)
# all other params will take defaults
jobs = jobCreator.generateJobs(tmp_template)
return jobs
但是我需要argparse
,因为我将构建一个命令行界面
"""change Default params with AddSpecific"""
def add_Specific(tmp_template,paraName,*params):
jobCreator = job.JobCreator()
#jobCreator.addSpecific('temp0', 0.1,0.2,0.3,0.4,....,0.7,...)
jobCreator.addRange(paraName, params)
# all other params will take defaults
jobs = jobCreator.generateJobs(tmp_template)
return jobs
我忘记了其他方法的一些细节:
"""change Default params with AddSpecific"""
def add_Specific(tmp_template,paraName,*params):
jobCreator = job.JobCreator()
#jobCreator.addSpecific('temp0', 0.1,0.2,0.3,0.4,....,0.7,...)
jobCreator.addRange(paraName, params)
# all other params will take defaults
jobs = jobCreator.generateJobs(tmp_template)
return jobs
这是正确的方法吗?在这里,
参数
参数将有一个8对的列表,例如:
"""change Default params with AddSpecific"""
def add_Specific(tmp_template,paraName,*params):
jobCreator = job.JobCreator()
#jobCreator.addSpecific('temp0', 0.1,0.2,0.3,0.4,....,0.7,...)
jobCreator.addRange(paraName, params)
# all other params will take defaults
jobs = jobCreator.generateJobs(tmp_template)
return jobs
CLI.py -p argname1=v1 ... argname8=v8
(显然,argnameN
应该是所需函数的参数名)
"""change Default params with AddSpecific"""
def add_Specific(tmp_template,paraName,*params):
jobCreator = job.JobCreator()
#jobCreator.addSpecific('temp0', 0.1,0.2,0.3,0.4,....,0.7,...)
jobCreator.addRange(paraName, params)
# all other params will take defaults
jobs = jobCreator.generateJobs(tmp_template)
return jobs
然后,您可以轻松地将args.p
(即['argname1=v1',…'argname8=v8']
)转换为字典:
"""change Default params with AddSpecific"""
def add_Specific(tmp_template,paraName,*params):
jobCreator = job.JobCreator()
#jobCreator.addSpecific('temp0', 0.1,0.2,0.3,0.4,....,0.7,...)
jobCreator.addRange(paraName, params)
# all other params will take defaults
jobs = jobCreator.generateJobs(tmp_template)
return jobs
def convert_value(v):
try:
return float(v) if '.' in v else int(v)
except ValueError:
# v is not a number
return v
params = dict([convert_value(n) for n in pair.split('=')] for pair in args.p)
并将其传递给您的函数:
"""change Default params with AddSpecific"""
def add_Specific(tmp_template,paraName,*params):
jobCreator = job.JobCreator()
#jobCreator.addSpecific('temp0', 0.1,0.2,0.3,0.4,....,0.7,...)
jobCreator.addRange(paraName, params)
# all other params will take defaults
jobs = jobCreator.generateJobs(tmp_template)
return jobs
"""Create a Template for a Job"""
def create_Template(params):
#single GA job
logging.basicConfig(level=logging.DEBUG)
template = job.JobTemplate(runGASimple)
print tmpverb
template.setDefaults(**params)
return template
通过创建两个不同的范围参数,可以对范围参数执行相同的操作:
"""change Default params with AddSpecific"""
def add_Specific(tmp_template,paraName,*params):
jobCreator = job.JobCreator()
#jobCreator.addSpecific('temp0', 0.1,0.2,0.3,0.4,....,0.7,...)
jobCreator.addRange(paraName, params)
# all other params will take defaults
jobs = jobCreator.generateJobs(tmp_template)
return jobs
"""change Default params with AddRange"""
def add_Range(var_1, var_2, tmp_template):
jobCreator = job.JobCreator()
#jobCreator.addRange('temp0', start=0.0, end=1.0, stepSize=0.1)
jobCreator.addRange(**var_1)
#jobCreator.addRange('temp1', start=0.0, end=1.0, stepSize=0.1)
jobCreator.addRange(**var_2)
# all other params will take defaults
jobs = jobCreator.generateJobs(tmp_template)
请注意Gall的答案-它可能会大大简化您的代码。 关于动态“argparse”,请尝试以下方法:
"""change Default params with AddSpecific"""
def add_Specific(tmp_template,paraName,*params):
jobCreator = job.JobCreator()
#jobCreator.addSpecific('temp0', 0.1,0.2,0.3,0.4,....,0.7,...)
jobCreator.addRange(paraName, params)
# all other params will take defaults
jobs = jobCreator.generateJobs(tmp_template)
return jobs
#!/usr/bin/env python
from __future__ import print_function
from __future__ import unicode_literals
import argparse
args_d = {
'-r': {
'flags': ['-r', '--range'],
'nargs': 8,
'help': 'AddRange Parameters',
'dest': 'r'
},
'-p': {
'flags': ['-p', '--parameters'],
'nargs': 8,
'help': 'SetDefaults as Parameters',
'dest': 'p'
}
}
def setup_parser(args_d):
parser = argparse.ArgumentParser()
for k,v in args_d.items():
if 'flags' in v:
flags = v['flags']
del v['flags']
parser.add_argument(*flags, **v)
return parser
if __name__ == "__main__":
args = setup_parser(args_d).parse_args()
print(args)
您仍然需要动态生成字典。您可以尝试使用“inspect”模块来实现这一点……看看
plac
插件(pypi源代码)。它可以从几个函数的参数签名创建一个解析器。非常感谢!!!我尝试了它,但我的程序有以下输出:AttributeError:'NoneType'对象没有属性'defaults',我忘记了其他方法的一些细节:“使用AddSpecific”“更改默认参数”“def add_Specific(tmp_模板,paraName,*params):jobCreator=job.jobCreator()#jobCreator.AddSpecific('temp0',0.1,0.2,0.3,0.4,…,0.7,…)jobCreator.addRange(paraName,params)#所有其他参数将采用默认的jobs=jobCreator.generateJobs(tmp_模板)return jobs感谢大家的鼓励,我在两个月前开始编写python。
"""change Default params with AddSpecific"""
def add_Specific(tmp_template,paraName,*params):
jobCreator = job.JobCreator()
#jobCreator.addSpecific('temp0', 0.1,0.2,0.3,0.4,....,0.7,...)
jobCreator.addRange(paraName, params)
# all other params will take defaults
jobs = jobCreator.generateJobs(tmp_template)
return jobs