【问题标题】:Executing argparse Arguments in order they are passed in terminal / cmd执行 argparse 参数,以便它们在终端 / cmd 中传递
【发布时间】:2020-11-03 04:48:22
【问题描述】:

我有一个数据增强脚本,它有一个类,其中包含一组由 argparse 参数触发的可选方法。我很好奇如何根据从终端传入的顺序来构造我的代码来处理 argparse 命令。

目标:如果我将参数传递为:python maths.py --add --multiply 我希望它先加 10,然后乘以 5 秒。 如果我将参数传递为:python maths.py --multiply --add 我希望它先乘以 5,然后加 10。

例如:

class Maths:
      def __init__(self):
          self.counter = 0

      def addition(self, num):
          self.counter += num
          return self

      def multiply(self, num):
          self.counter *= num
          return self

 
def main():
        parser = argparse.ArgumentParser()
        parser.add_argument('--add', required = False, action = 'store_true')
        parser.add_argument('--multiply', required = False, action = 'store_true')
        args = parser.parse_args()
        maths = Maths()
        maths.addition(10)
        maths.multiply(5)
        print(maths.counter)

if __name__ == "__main__":
      main()

如何根据传入参数的顺序完成排序?谢谢!

【问题讨论】:

  • argparse 不是一个很好的解析器。链接中的所有建议都与 args 命名空间固有的无序性质作斗争。如果有订单,则由add_argument 命令及其默认值确定。用户值只是覆盖那些默认值。
  • @hpaulj 你有什么建议让这个结构更可变吗?情况是我有不同的增强方法,并且以不同的顺序使用它们会产生不同的结果。我想让它从用户的角度来看是动态的。
  • 我只是想到了几种按顺序收集输入的方法。

标签: python-3.x class cmd terminal argparse


【解决方案1】:

这个解析器提供了两种输入字符串列表的方法:

In [10]: parser = argparse.ArgumentParser() 
    ...: parser.add_argument('--cmds', nargs='*', choices=['add','mult']) 
    ...: parser.add_argument('--add', dest='actions', action='append_const', const='add') 
    ...: parser.add_argument('--multiply', dest='actions', action = 'append_const', const='mult') 
    ...: parser.print_help() 
    ...:  
    ...:                                                                                             
usage: ipython3 [-h] [--cmds [{add,mult} [{add,mult} ...]]] [--add]
                [--multiply]

optional arguments:
  -h, --help            show this help message and exit
  --cmds [{add,mult} [{add,mult} ...]]
  --add
  --multiply

作为“--cmds”参数的值:

In [11]: parser.parse_args('--cmds mult add'.split())                                                
Out[11]: Namespace(actions=None, cmds=['mult', 'add'])

作为单独的标记参数:

In [12]: parser.parse_args('--mult --add'.split())                                                   
Out[12]: Namespace(actions=['mult', 'add'], cmds=None)

在这两种情况下,我都会创建一个字符串列表。在第二个中,const 值可以是函数或方法。

const=maths.addition

【讨论】:

  • 这看起来真不错。明天我会试一试,看看它是否能解决我的问题。
猜你喜欢
  • 2021-05-20
  • 2021-02-06
  • 2019-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-15
  • 2013-02-18
  • 1970-01-01
相关资源
最近更新 更多