如何翻译一个Python脚本到Lua脚本?

问题描述 投票:3回答:4

我想一段代码,我用Python写到Lua翻译。我使用合成包装的Blackmagic融合这里面的代码。

任何帮助将不胜感激!

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
python error-handling lua try-catch blackmagic-fusion
4个回答
7
投票

Lua的异常处理的工作比在其他语言中有一点不同。相反,在包装的try / catch语句代码,你不是在pcall一个“保护环境”运行功能。

对于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
投票

您未使用正确PCALL。你需要通过它,你真的想调用的函数,它会调用它在受保护的模式,它可以捕获错误。

PCALL返回两个值,一个布尔值,指示是否调用成功与否,如果呼叫没有成功的错误代码。

你的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称取PARAMS功能的情况下,你可以简单地将它们作为额外值PCALL,它会通过那些上你给它时,它调用它的方法。

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

举个例子。

上面的行大致翻译为:

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

1
投票

注意区别:

pcall (foo())
pcall (foo)

第一行调用函数foo然后将它的结果pcall。如果foo引发错误,pcall将永远不会被调用。

所述第二线通过功能foopcallpcall调用foo。如果foo抛出pcall捕捉它,并返回一个错误消息的错误。


在你的榜样,你正在做一个方法调用,其中comp:ActiveTool()comp.ActiveTool(comp)语法糖,所以你必须调用PCALL时考虑到这一点:comp:ActiveTool() => pcall(comp.ActiveTool, comp)


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

© www.soinside.com 2019 - 2024. All rights reserved.