嗨,我想我有无法传递任何值的解析器参数,例如:
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")
答案 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
中存储某种值的变量;并退出系统。