【问题标题】:argparse: Converter Function for Option with Multiple Parameters?argparse:具有多个参数的选项的转换器函数?
【发布时间】:2018-07-21 10:20:36
【问题描述】:

我想对选项的参数应用不同的转换函数。

考虑以下代码:

parser:option('-c --circle')
   :argname{'<radius>', '<coordinates>'}
   -- does not work like this:
   -- :convert{['<radius>']=tonumber, ['<coordinates>']=tocoords}
   :default{1, {0,0}}
   :args(2)
   :count '0-1'

如您所见,该程序有一个选项-c,它接受两个参数:radiuscoordinates。我想分别应用到不同的转换函数(tonumbertocoords)。阅读the documentation我不知道该怎么做。

这可能吗?如果可以,那么正确的设置方法是什么?

【问题讨论】:

    标签: lua command-line-arguments argparse


    【解决方案1】:

    如果您认为 Lua Argparse 系统不允许您指定多个函数来将参数转换为特定选项是正确的,那么可能还有一种方法可以做到这一点。毕竟,Argparse 必须为每个参数调用一次转换函数。并且没有规定转换函数必须为每次调用做同样的事情。您唯一没有的信息是它被调用的特定参数。

    所以... 作弊。使用 Lua 的一流函数创建该信息(注意:以下使用 Lua 5.3):

    local function multi_arg_parser(...)
      local index = 0
      local funcs = table.pack(...)
      return function(...)
        index = index + 1
        return funcs[index](...)
      end
    end
    
    parser:option('-c --circle')
       :argname{'<radius>', '<coordinates>'}
       :convert(multi_arg_parser(tonumber, tocoords))
       :default{1, {0,0}}
       :args(2)
       :count '0-1'
    

    这将起作用提供 Argparse 将为每个参数只调用一次convert 函数并且按照它们出现在参数中的顺序调用convert命令行。 Argparse 几乎肯定不能保证这一点,但这是一个合理的假设。

    【讨论】:

      【解决方案2】:

      因为 argparse 0.6.0 这有效:

      :convert{tonumber, tocoords}
      

      documentation:

      如果一个元素的convert属性是一个函数数组,当元素接受多个参数时,它们将被用作对应参数的转换器。

      【讨论】:

        【解决方案3】:

        我建议使用 Lapp Framework。它通过传递给add_type 方法的转换器方法支持转换。此外,它还具有其他方便的功能,例如断言和默认值。

        【讨论】:

          猜你喜欢
          • 2020-03-16
          • 2018-07-23
          • 2015-12-11
          • 1970-01-01
          • 2020-10-23
          • 2021-06-27
          • 2021-09-24
          • 2022-08-14
          • 1970-01-01
          相关资源
          最近更新 更多