我尝试设置可以通过命令行使用命令行参数运行的代码,或者可以使用传递的参数从python脚本或交互式会话中调用。这样做有什么好的模式/方法?
我现在使用的基本想法是:
from argparse import ArgumentParser
class Sets:
def __init__(self):
self.verbose = False
self.par = 1
self.args = ['run', 'test']
def _update(self, parsed):
for key in vars(parsed).keys():
setattr(self, key, getattr(parsed, key))
print("\t", getattr(self, key))
def main(**kwargs):
sets = _parseArgs()
for key in kwargs.keys():
setattr(sets, key, kwargs[key])
print("verbose = ", sets.verbose)
print("par = ", sets.par)
print("args = ", sets.args)
return
def _parseArgs():
sets = Sets()
pars = ArgumentParser()
pars.add_argument('--verbose', action='store_true', default=sets.verbose)
pars.add_argument('--par', nargs=1, type=int, default=sets.par)
pars.add_argument('--args', nargs='+', type=str, default=sets.args)
sets._update(pars.parse_args())
return sets
if __name__ == "__main__":
main()
但这似乎有点令人费解......
答案 0 :(得分:1)
from argparse import ArgumentParser
def main(**kwargs):
print(kwargs)
if __name__ == "__main__":
pars = ArgumentParser()
pars.add_argument('--verbose', action='store_true')
pars.add_argument('--par', nargs=1, type=int, default=1)
pars.add_argument('--args', nargs='+', type=str, default=['run', 'test'])
main(**vars(pars.parse_args()))
输出:
{'par': 1, 'args': ['run', 'test'], 'verbose': False}
或者:
from argparse import ArgumentParser
def main(args):
print(args)
if __name__ == "__main__":
pars = ArgumentParser()
pars.add_argument('--verbose', action='store_true')
pars.add_argument('--par', nargs=1, type=int, default=1)
pars.add_argument('--args', nargs='+', type=str, default=['run', 'test'])
main(pars.parse_args())
哪个输出:
Namespace(args=['run', 'test'], par=1, verbose=False)
...但您可以更轻松地访问它,例如args.args
,args.par
,args.verbose
。
答案 1 :(得分:1)
您的Sets
课程似乎没问题,但我还没有对其进行测试。但我认为,这比你需要的更复杂。将main
调用放在if __name__
块中是正确的。有时解析器也在那里定义,但这不是必需的。
只要参数名称不常见,您就可以将这些值作为属性访问。
args = parser.parse_args()
print("verbose = ", args.verbose)
print("par = ", args.par)
print("args = ", args.args)
您可以使用:
构建自己的args
对象
args = argparse.Namespace(verbose=False, par=1, args=['run', 'test'])
实际上你可以将它传递给解析器:
args = parser.parse_args(namespace=args)
您可以替换自己的命令行'列表
args = parser.parse_args(['--verbose','--par','2'])
我经常在测试解析器代码时使用该格式。
顺便问一下,你真的想要par
nargs=1
吗?默认nargs
需要一个参数。 nargs=1
执行相同的操作,但会在命名空间中创建一个列表pars=[1]
。
用
dd = vars(args)
您可以使用所有正常的字典操作。例如:
dd0 = dict(pars=3, verbose=False)
dd0.update(vars(args))
如果dd0
包含与解析器相同的键,则不会执行任何重要操作。 args
将始终具有这些值,无论是默认值还是命令行。
另一种选择是在函数中定义关键字参数。
def myaction(verbose = False,pars = 1,args = None,** kwargs): #做些什么 print(verbose,pars,args,kwargs)
使用:
myaction(**vars(args))
myaction(pars=2, args=[12,34], extra='for kwargs')
myaction(**{'pars':3})