ArgumentParser.add_argument: 如何使用带有自定义类型参数的动作参数?

ArgumentParser.add_argument: How to use action parameter with custom type parameter?

当我尝试做什么问题是关于使用:

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

...我收到此错误:

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

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

python3 script.py --blah

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

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

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

args = parser.parse_args()

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

if args.blah:
     func()

这是一种方法:

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

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

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

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

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

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

但是 action='store_true' 创建了一个 True/False 参数。标志后不需要参数。所以给它一个type参数是没有意义的。诚然,错误信息可能更清楚,但这种错误并不经常出现。这是一个开发问题,而不是 运行一次。

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

你希望 func 什么时候成为 运行?在解析了所有命令行之后?或者还在解析的时候?我更喜欢将解析与 运行ning 分开。使用 argparse 来弄清楚你的用户想要什么;使用您自己的代码执行之后的操作。