【问题标题】:Python argparse custom actions with additional arguments passed传递了附加参数的 Python argparse 自定义操作
【发布时间】:2011-12-26 00:50:47
【问题描述】:
import argparse

class customAction(argparse.Action):
    def __call__(self, parser, args, values, option_string=None):
       setattr(args, self.dest, values)

parser = argparse.ArgumentParser()
parser.add_argument('-e', '--example', action=customAction)

我想在触发选项 -e 时将其他参数传递给 customAction,例如另一个类的实例。我怎样才能做到这一点?我尝试过的一切都出错了。

【问题讨论】:

    标签: python action argparse


    【解决方案1】:
    def make_action(additional_arg):
        class customAction(argparse.Action):
            def __call__(self, parser, args, values, option_string=None):
                print(additional_arg)
                setattr(args, self.dest, values)
        return customAction
    #...
    parser.add_argument('-e', '--example', action=make_action('your arg'))
    

    【讨论】:

      【解决方案2】:

      另一种解决方案是像这样派生基类argparse.Action

      class CustomAction(argparse.Action):
          def __init__(self,option_strings,
                       additional_arg1,additional_arg2,
                       dest=None,
                       nargs=0,
                       default=None,
                       required=False,
                       type=None,
                       metavar=None,
                       help=None):
              self._a1=additional_arg1
              self._a2=additional_arg2
              super(CustomAction, self).__init__(
                  option_strings=option_strings,
                  dest=dest,
                  nargs=nargs,
                  default=default,
                  required=required,
                  metavar=metavar,
                  type=type,
                  help=help)
          def __call__(self, parser, namespace, values, option_string=None):
              print(self._a1)
              print(self._a2)
              setattr(args, self.dest, values)
      
      #........
      parser.add_argument('-e', '--example', action=CustomAction, additional_arg1='your arg', additional_arg2=42)
      

      或者,提供*args**kwargs 以将任何附加参数传递给父构造函数。

      class CustomAction(argparse.Action):
          def __init__(self, option_strings, additional_arg1, additional_arg2,
                       *args, **kwargs):
              self._a1 = additional_arg1
              self._a2 = additional_arg2
              super(CustomAction, self).__init__(option_strings=option_strings,
                                                 *args, **kwargs)
          def __call__(self, parser, namespace, values, option_string=None):
              print(self._a1)
              print(self._a2)
              setattr(args, self.dest, values)
      
      #........
      parser.add_argument('-e', '--example', action=CustomAction, additional_arg1='your arg', additional_arg2=42)
      

      【讨论】:

      • 尽管我很喜欢闭包,但这个答案让我觉得它是一个更简洁(如果更面向对象)的解决方案。任何使用它的人都可以考虑添加 *args**kwargs 而不是列出所有 argparse 的默认 Action 参数。
      • 这个例子我需要将 setattr(args 改为 setattr(namespace 以使其工作
      猜你喜欢
      • 1970-01-01
      • 2021-11-07
      • 2013-11-06
      • 2020-02-13
      • 2015-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多