【问题标题】:ArgumentParser.add_argument: How to use action parameter with custom type parameter?ArgumentParser.add_argument:如何将动作参数与自定义类型参数一起使用?
【发布时间】:2017-12-05 19:35:55
【问题描述】:

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

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

...我收到此错误:

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

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

python3 script.py --blah

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

【问题讨论】:

  • docs.python.org/3/library/argparse.html#type 似乎 actiontype 是这个函数的冲突参数。
  • @Coldspeed 那么,有什么替代方案?
  • 你可以这样做:parser.add_argument("--blah", help="Whatever", action='store_true') ; args = parser.parse('...'); if args.blah: func() 类似于@SunnyAggarwal 发布的内容。

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


【解决方案1】:

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 找出您的用户想要什么;之后使用您自己的代码执行操作。

【讨论】:

  • 感谢您提供如此有见地的回答。至于你问的问题——我想像这样从命令行运行funcpython script.py --blah,即解析完成后。
【解决方案2】:

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

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

args = parser.parse_args()

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

if args.blah:
     func()

【讨论】:

  • if args['blah']: -- 我怀疑这是一个有效的语法。你的意思是if args == 'blah'
  • 是的,我的错误参数可以通过使用点的属性类型访问来访问
【解决方案3】:

这是一种方法:

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

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

【讨论】:

  • 我不明白你说的清理参数是什么意思。你能解释一下吗?
  • 这只是一个示例函数来演示
【解决方案4】:
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()

【讨论】:

    猜你喜欢
    • 2018-09-18
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-08
    • 1970-01-01
    相关资源
    最近更新 更多