如何将 Python 脚本翻译成 Lua 脚本?

我正在尝试将我写的 Python 代码转换为 Lua。我正在将这个代码用于合成软件 Blackmagic Fusion 中。

非常感谢任何帮助!

Python 脚本(有效的):

try:
    comp.ActiveTool()                            # 检查是否选择了一个工具
except:
    print("nothing selected")
    comp.AddTool("PolylineMask", -32768, -32768) # 如果没有选择任何工具,则添加一个工具

Lua 脚本(仍然无法正常工作且出错):

if pcall (comp:ActiveTool()) then
    print "Node Selected"
else
   comp:AddTool("PolylineMask", -32768, -32768)
end
点赞
用户1208078
用户1208078

你没有正确使用 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 调用带有参数的函数时,你可以简单地将它们作为额外的值传递给 pcall,它会在调用它时将它们传递给你给它的方法。

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

作为一个例子,上面的行大致翻译成:

尝试{
    comp.AddTool('PolylineMask', -32768, -32768);
    返回 true
}
捕获 (err) {
    返回 false,err
}
2013-07-24 17:15:48
用户501459
用户501459

注意区别:

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)

2013-07-24 21:54:01
用户646619
用户646619

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)
2013-07-24 21:54:12
用户687208
用户687208
-- 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

test.lua 中的这段代码翻译成了中文,并且保留了原本的 markdown 格式。

test.lua 中引入了 try-catch 模块。

使用 try 函数来尝试执行一个函数,并判断是否出现异常。在本例中,将一个会抛出异常的匿名函数作为参数传入 try 函数中。如果函数执行过程中出现异常,则异常信息会被传递给 what[2](也就是 catch 函数)。在本例中,catch 函数是一个包含有一个匿名函数的表。这个匿名函数会将接收到的异常信息打印出来。

2015-07-19 23:31:45