argparse: 有多个参数的选项的转换器函数?

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

考虑下面这段代码:

parser:option('-c --circle')
   :argname{'<radius>', '<coordinates>'}
   -- 不可以这样工作:
   -- :convert{['<radius>']=tonumber, ['<coordinates>']=tocoords}
   :default{1, {0,0}}
   :args(2)
   :count '0-1'

正如你看到的,这个程序有一个选项-c,它需要两个参数:radiuscoordinates。我想分别应用不同的转换函数(tonumbertocoords)。阅读文档后,我不知道如何做到这一点。

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

点赞
用户734069
用户734069

如果你说 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保证的,但这是一个合理的假设。

2018-02-11 03:51:05
用户2733013
用户2733013

自 argparse 版本 0.6.0 开始,下列代码可用:

:convert{tonumber, tocoords}

请查看文档

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

2018-04-30 17:03:51
用户2696875
用户2696875

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

2018-06-08 12:59:30