12 python methods arguments dynamic argparse
我正在编写一个相对简单的Python脚本,它支持几个不同的命令.不同的命令支持不同的选项,我希望能够将argparse解析的选项传递给指定命令的正确方法.
用法字符串如下所示:
usage: script.py [-h]
{a, b, c}
...
script.py: error: too few arguments
Run Code Online (Sandbox Code Playgroud)
我可以轻松调用适当的方法:
def a():
...
def b():
...
def c():
...
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.set_defaults(method = a)
...
arguments = parser.parse_args()
arguments.method()
Run Code Online (Sandbox Code Playgroud)
但是,我必须将参数传递给这些方法,并且它们都接受不同的参数集.
目前,我只是传递Namespaceargparse返回的对象,如下所示:
def a(arguments):
arg1 = getattr(arguments, 'arg1', None)
...
Run Code Online (Sandbox Code Playgroud)
这似乎有点尴尬,并且使方法更难以重用,因为我必须将参数作为dict或命名空间而不是通常的参数传递.
我想在某种程度上使用参数定义方法(就像普通函数一样),并且仍然能够在传递适当的参数时动态调用它们.像这样:
def a(arg1, arg2):
...
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.set_defaults(method = a)
...
arguments = parser.parse_args()
arguments.method() # <<<< Arguments passed here somehow
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
小智 6
我找到了一个很好的解决方案:
import argparse
def a(arg1, arg2, **kwargs):
print arg1
print arg2
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.set_defaults(method = a)
parser.add_argument('arg1', type = str)
parser.add_argument('arg2', type = str)
arguments = parser.parse_args()
arguments.method(**vars(arguments))
Run Code Online (Sandbox Code Playgroud)
当然,如果方法的参数与argparse使用的参数的名称冲突,则存在一个小问题,尽管我认为这比传递Namespace对象和使用更好getattr.
| 归档时间: |
|
| 查看次数: |
10962 次 |
| 最近记录: |