ArgumentParser.add_argument:如何将动作参数与自定义类型参数一起使用?



当我尝试做关于使用的问题时:

parser.add_argument("--blah", type=func, help="Whatever", action='store_true')

。我收到此错误:

TypeError: __init__() got an unexpected keyword argument 'type'

我真正想要的只是在命令行上使用此标志时运行一个名为 func 的函数(上面指定为参数类型(,如下所示:

python3 script.py --blah

这可能吗?如果我需要更详细地说明我的问题,请告诉我。

type参数旨在是一个函数,用于测试和/或将命令行参数转换为将存储在args命名空间中的内容。

parser.parse_args('--foo', type=int)  # default store action

['--foo','123']转换为Namespace(foo=123),而不是foo='123'

但是action='store_true'创建了一个真/假参数。 它不需要在标志之后进行争论。 所以给它一个type参数是没有意义的。 诚然,错误消息可能更清晰,但这种错误并不经常出现。 这是一个开发问题,而不是运行时问题。

正如其他人指出的那样,您可以使用args.blahTrue/False值在解析后有条件地运行func

您希望何时运行func? 解析完所有命令行后? 还是在它仍在解析时? 我更喜欢将解析与运行分开。 使用argparse来弄清楚用户想要什么;使用您自己的代码在之后执行操作。

解析参数后可以调用函数

parser.add_argument("--blah", help="Whatever", action='store_true')

args = parser.parse_args()

然后检查标志值并适当地调用函数

if args.blah:
func()
import argparse
def func():
pass
def main(args):
############### Parsed command line arguments to initialize variables ######################
blah = args.blah
if blah:
func()
def get_parser():
### Command line input parsing here. ###########
parser = argparse.ArgumentParser(prog='python ' + sys.argv[0], description='This program does blah!')
parser.add_argument("-blah", , help='Run func',default= False, action='store_true')
if __name__ == "__main__":
parser = get_parser() 
args = parser.parse_args()

这里有一种方法可以做到这一点:

from argparse import Action
class CleanUpAction(Action):
'''
@summary: Clean up the arguments
'''
def __call__(self, parser, args, values, option_string=None):
if values.startswith(''') and values.endswith('''):
values = values[1:-1]
setattr(args, self.dest, values)
parser.add_argument('-blah', '--blah', type=str, action=CleanUpAction, help='clean up the argument')

这样,它在清理执行后存储

最新更新