我想将不同的转换函数应用于选项的参数。
请考虑以下代码:
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
,它有两个参数:radius
和coordinates
。我想分别应用于不同的转换函数(tonumber
和tocoords
)。阅读the documentation我无法弄清楚如何做到这一点。
这可能吗?如果可以,那么设置它的正确方法是什么?
答案 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方法的转换器方法支持转化。此外,它还带有其他方便的功能,如断言和默认值。