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

时间:2017-07-02 11:17:11

标签: python python-2.7 python-3.x command-line-arguments argparse

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

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

...我收到此错误:

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

我真正想要的是在命令行上使用这个标志时运行一个名为func的函数(在上面指定为参数类型):

python3 script.py --blah

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

4 个答案:

答案 0 :(得分:1)

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

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

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

但是action='store_true'会创建一个True / False参数。在旗帜之后不进行争论。因此给它一个type参数毫无意义。不可否认,错误信息可能更清楚,但这种错误通常不会出现。这是一个开发问题,而不是运行时问题。

正如其他人所指出的,您可以使用True/False args.blah值来解析后有条件地运行func

您希望何时运行func?在解析完所有命令行之后?或者它还在解析?我更喜欢将解析与运行分开。使用argparse来确定用户想要的内容;使用自己的代码来执行操作。

答案 1 :(得分:0)

您可以在解析参数后调用您的函数

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

args = parser.parse_args()

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

if args.blah:
     func()

答案 2 :(得分:0)

这是一种方法:

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

这种方式在清理执行后存储

答案 3 :(得分:0)

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