Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 模式来处理命令行参数和/或api方法参数_Python_Api_Command Line Arguments_Argparse - Fatal编程技术网

Python 模式来处理命令行参数和/或api方法参数

Python 模式来处理命令行参数和/或api方法参数,python,api,command-line-arguments,argparse,Python,Api,Command Line Arguments,Argparse,我正在尝试设置一个代码,该代码可以通过命令行运行并带有命令行参数,也可以通过python脚本或交互式会话调用,并带有传递的参数。这样做的好模式/方法是什么 我现在使用的基本思想是: from argparse import ArgumentParser class Sets: def __init__(self): self.verbose = False self.par = 1 self.args = ['run', 'test']

我正在尝试设置一个代码,该代码可以通过命令行运行并带有命令行参数,也可以通过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()
但它似乎有点复杂

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}
或:

哪些产出:

Namespace(args=['run', 'test'], par=1, verbose=False)

。。。但是您可以更容易地访问它,例如,
args.args
args.par
args.verbose
您的
集合
类看起来不错,尽管我还没有测试过它。但我认为这比你需要的更复杂。将
main
调用放入
if\uuuu\u name\uuu
块是正确的。有时解析器也在那里定义,但这不是必需的

只要参数名称不是异常的,就可以作为属性访问这些值

 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]

您可以使用所有常规字典操作。例如:

dd0 = dict(pars=3, verbose=False)
dd0.update(vars(args))
不过,如果
dd0
包含与解析器相同的键,那么这并没有什么意义<代码>参数将始终具有这些值,无论是默认值还是命令行中的值

另一个选项是在函数中定义关键字参数

def myaction(详细=假,PAR=1,args=无,**kwargs): #用这些做点什么 打印(详细、PAR、ARG、kwargs)

使用:


这里不需要
dict
dict(vars(…)
vars()
返回字典。谢谢!这无疑是一个更大的进步--
集合
对象显然是多余的…您打算如何在会话或脚本中使用它?@hpaulj如果我理解正确的话:两者--interactive/as imported函数和可执行脚本。谢谢,这里有一些非常有用的东西!我省略了
main
定义中的命名变量,因为这只是重写它们的另一个地方(除了
add_参数和
集合中的
之外)。我确实看到
集合
对象是多余的。
dd = vars(args)
dd0 = dict(pars=3, verbose=False)
dd0.update(vars(args))
myaction(**vars(args))
myaction(pars=2, args=[12,34], extra='for kwargs')
myaction(**{'pars':3})