gpt4 book ai didi

python - 处理命令行参数和/或 api 方法参数的模式

转载 作者:行者123 更新时间:2023-12-01 04:19:09 25 4
gpt4 key购买 nike

我正在尝试设置一个可以通过带有命令行参数的命令行运行的代码,或者可以通过传递的参数从Python脚本或交互式 session 中调用的代码。执行此操作的良好模式/方法是什么?

我现在使用的基本想法是:

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()

但是看起来有点复杂......

最佳答案

你的Sets类看起来没问题,尽管我还没有测试过。但我认为,它比你需要的更复杂。将 main 调用放在 if __name__ block 中是正确的。有时解析器也在那里定义,但这不是必需的。

只要参数名称不常见,您就可以将值作为属性访问。

 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): # 用这些做点什么 打印(详细,pars,args,kwargs)

用途:

myaction(**vars(args))
myaction(pars=2, args=[12,34], extra='for kwargs')
myaction(**{'pars':3})

关于python - 处理命令行参数和/或 api 方法参数的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33926221/

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