argparse:具有多个参数的选项的转换器功能?

时间:2018-02-10 22:33:06

标签: lua command-line-arguments argparse

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

请考虑以下代码:

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我无法弄清楚如何做到这一点。

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

3 个答案:

答案 0 :(得分:2)

由于argparse 0.6.0可行:

:convert{tonumber, tocoords}

请参阅documentation

  

如果元素的convert属性是函数数组,则在元素接受多个参数的情况下,它们将用作相应参数的转换器。

答案 1 :(得分: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 :(得分:0)

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