Python - 将参数从 Argparse 传递给不同的方法

标签 python dynamic methods arguments argparse

我正在编写一个相对简单的 Python 脚本,它支持几个不同的命令。不同的命令支持不同的选项,我希望能够将 argparse 解析的选项传递给指定命令的正确方法。

用法字符串如下所示:

usage: script.py [-h]

            {a, b, c}
            ...
script.py: error: too few arguments

我可以很容易地调用适当的方法:

def a():
    ...

def b():
    ...

def c():
    ...

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.set_defaults(method = a)
    ...

    arguments = parser.parse_args()
    arguments.method()

但是,我必须将参数传递给这些方法,它们都接受不同的参数集。

目前,我只是传递 argparse 返回的 Namespace 对象,如下所示:

 def a(arguments):
     arg1 = getattr(arguments, 'arg1', None)
     ...

这看起来有点尴尬,并且使方法更难重用,因为我必须将参数作为 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

有什么想法吗?

最佳答案

我找到了一个很好的解决方案:

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

当然,如果方法的参数与 argparse 使用的参数的名称冲突,则会出现一个小问题,尽管我认为这比传递 Namespace 对象并使用 getattr 更可取。 .

关于Python - 将参数从 Argparse 传递给不同的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7336181/

相关文章:

python - Pandas 中大量列的Groupby

python - 按列索引重命名 csv 中的列

HTML 表单文本框动态信息框?

动态交互问题

c# - 如何在设置类型等方法中设置参数

python - 从 pandas DataFrame 中删除包含空单元格的行

python - Pycharm SSH 插件缺少 Ubuntu 16.04

excel - 另一个工作表的动态命名范围

objective-c - Obj-C 内省(introspection) : How can a method reference its own selector?

java - 为什么java不让我调用这个 protected 函数