如何将Python脚本转换为Lua脚本?

时间:2013-07-24 17:10:20

标签: python error-handling lua try-catch blackmagic-fusion

我正在尝试将我用Python写的一段代码翻译成Lua。我在合成包Blackmagic Fusion中使用此代码。

非常感谢任何帮助!

Python脚本(工作):

try:
    comp.ActiveTool()                            # checks if a tool is selected
except:
    print("nothing selected")
    comp.AddTool("PolylineMask", -32768, -32768) # adds a tool if nothing's selected

Lua脚本(仍然没有工作和错误):

if pcall (comp:ActiveTool()) then
    print "Node Selected"
else
   comp:AddTool("PolylineMask", -32768, -32768)
end

4 个答案:

答案 0 :(得分:7)

Lua的异常处理与其他语言的处理方式略有不同。您可以使用pcall在“受保护的环境”中运行函数,而不是将代码包装在try / catch语句中。

pcall的一般语法是:

local ok, err = pcall(myfunc, arg1, arg2, ...)
if not ok then
    print("The error message was "..err)
else
    print("The call went OK!")
end

myfunc是您要调用的函数,arg1等等是参数。请注意,您实际上并没有调用该函数,只是将其传递给pcall可以为您调用它。

请注意,Lua中的tbl:method(arg1, arg2)tbl.method(tbl, arg1, arg2)的语法糖。但是,由于您没有自己调用该函数,因此无法使用该语法。您需要将表作为第一个参数传递给pcall,如下所示:

pcall(tbl.method, tbl, arg1, arg2, ...)

因此,在您的情况下,它将是:

local ok, err = pcall(comp.ActiveTool, comp)

答案 1 :(得分:1)

您没有正确使用pcall。你需要传递你实际想要调用的函数,并且它会在受保护模式下调用它,它可以捕获错误。

pcall返回2个值,bool指示调用是否成功,如果调用未成功则返回错误代码。

你的lua代码应该看起来像这样:

local ok, err = pcall(comp.ActiveTool, comp)
if not ok then
    print(err, 'nothing selected')
    comp.AddTool(...)
else -- the call succeeded
    print 'Node Selected'
end

如果你想使用使用参数的pcall调用函数,你可以简单地将它们作为附加值传递给pcall,并且它会将它们传递给你调用它时给它的方法。

local ok, err = pcall(comp.AddTool, 'PolylineMask', -32768, -32768)

作为一个例子。

上述行大致转换为:

try {
    comp.AddTool('PolylineMask', -32768, -32768);
    return true
} 
catch (err) {
    return false, err
}

答案 2 :(得分:1)

注意区别:

pcall (foo())
pcall (foo)

第一行调用函数foo,然后将其结果传递给pcall。如果foo引发错误,则永远不会调用pcall

第二行将函数foo传递给pcallpcall来电foo。如果foo抛出错误pcall捕获它并返回错误消息。


在您的示例中,您正在进行方法调用,其中comp:ActiveTool()comp.ActiveTool(comp)的语法糖,因此您在调用pcall时必须考虑到这一点:comp:ActiveTool() = > pcall(comp.ActiveTool, comp)

答案 3 :(得分:0)

-- test.lua
require "try-catch"

try {
   function ()
      error('oops')
   end,

   catch {
      function (error)
         print('caught error: ' .. error)
      end
   }
}

...

-- try-catch.lua
function catch (what)
   return what[1]
end

function try (what)
   status, result = pcall(what[1])

   if not status then
      what[2](result)
   end

   return result
end

原始https://gist.github.com/cwarden/1207556