Python argparse-具有'store_true'行为的用户定义操作

时间:2019-05-28 18:20:34

标签: python argparse

嗨,我想我有无法传递任何值的解析器参数,例如:

parser.add_argument('-s', '--staged', action=FooAction)

我的用户定义操作:

class FooAction(argparse.Action):
    def __call__(self, parser, namespace, values, option_string=None):
        print("action")

当我尝试不使用任何值调用此方法时:

python my_script -s

我收到此错误消息:

test.py: error: argument -s/--staged: expected one argument

我知道我可以将操作'store_true'添加到我的参数中,但是在此解决方案中,我无法将该参数的执行重定向到我定义的操作类中。

有人知道如何修改FooAction来实现'store_true'行为吗?

编辑

设置nargs = 0的类Fooaction:

class FooAction(argparse.Action):
    def __init__(self, option_strings, dest, nargs=0, **kwargs):
        super(FooAction, self).__init__(option_strings, dest, nargs, **kwargs)
    def __call__(self, parser, namespace, values, option_string=None):
        print("action")

1 个答案:

答案 0 :(得分:1)

import argparse

class FooAction(argparse.Action):
    def __call__(self, parser, namespace, values, option_string=None):
        print("action")
        print(self)
        print(parser, namespace, values, option_string)

parser = argparse.ArgumentParser()
parser.add_argument('-s', '--staged', action=FooAction, nargs=0)
args = parser.parse_args()
print(args)

样品运行:

1151:~/mypy$ python3 stack56348020.py -s
action
FooAction(option_strings=['-s', '--staged'], dest='staged', nargs=0, const=None, default=None, type=None, choices=None, help=None, metavar=None)
ArgumentParser(prog='stack56348020.py', usage=None, description=None, formatter_class=<class 'argparse.HelpFormatter'>, conflict_handler='error', add_help=True) Namespace(staged=None) [] -s
Namespace(staged=None)

使用您的init

import argparse

class FooAction(argparse.Action):
    def __init__(self, option_strings, dest, nargs=0, **kwargs):
        super(FooAction, self).__init__(option_strings, dest, nargs=nargs, **kwargs)
    def __call__(self, parser, namespace, values, option_string=None):
        print("action")
        print(parser, namespace, values, option_string)

parser = argparse.ArgumentParser()
a1 = parser.add_argument('-s', '--staged', action=FooAction)
print(a1)   # display the action object and most of its parameters
args = parser.parse_args()
print(args)

1208:~/mypy$ python3 stack56348020.py -s
FooAction(option_strings=['-s', '--staged'], dest='staged', nargs=0, const=None, default=None, type=None, choices=None, help=None, metavar=None)
action
ArgumentParser(prog='stack56348020.py', usage=None, description=None, formatter_class=<class 'argparse.HelpFormatter'>, conflict_handler='error', add_help=True) Namespace(staged=None) [] -s
Namespace(staged=None)

add_argument返回其创建的Action对象。我们通常会忽略它,将其保存为参考,并在调试过程中方便打印。

即使Action子类被标记为“私有”(使用_),还是最好查看其代码以了解如何自定义基类。 Action类本身并不能做什么。默认操作使用_StoreAction。存储True / False子类_StoreConst_HelpAction是唯一不在namespace中存储某种值的变量;并退出系统。