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

3

我希望能够将我编写的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个回答

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

在Lua中,pcall函数用于调用其他函数,其中myfunc是你想要调用的函数名,arg1等是传入该函数的参数。需要注意的是,实际上并没有直接调用该函数,而是将其作为参数传递给pcall函数,以便让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调用带参数的函数,只需将它们作为附加值传递给pcall即可,它会在调用时将这些参数传递给您所提供的方法。

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

作为一个例子。
上述语句大致翻译为:
try {
    comp.AddTool('PolylineMask', -32768, -32768);
    return true
} 
catch (err) {
    return false, err
}

感谢您的快速回复。我仍在努力弄清楚这里发生了什么。我已经更新了Lua代码,但仍然出现错误。我希望它能运行这段代码“comp.AddTool('PolylineMask',-32768,-32768)”,而不是出错。我收到的错误消息是“尝试调用方法'ActiveTool'(空值)”。 - iGwok
1
你提到的错误只是Lua在说comp对象上没有名为ActiveTool的可用函数/属性。可能有几个原因导致这种情况发生。如果没有看到与comp对象相关的更多代码,我无法帮助您解决此问题。 - Mike Corcoran
@user2528059,根据你的意图猜测,你可能会使用local ok,err; if comp.ActiveTool then ok,err = false,"" else ok,err = pcall(comp:ActiveTool) end... - Doug Currie
应该是 pcall(comp.ActiveTool, comp),而不是 pcall(comp:ActiveTool) - Paul Kulchenko
@PaulKulchenko 谢谢,已修复。我有一段时间没有使用Lua了 =/ - Mike Corcoran

1
请注意区别:

pcall (foo())
pcall (foo)

第一行调用函数 foo ,然后将其结果传递给 pcall 。如果 foo 引发错误,则永远不会调用 pcall
第二行将函数 foo 传递给 pcall pcall 调用 foo 。如果 foo 引发错误,则 pcall 会捕获它并返回错误消息。

在你的例子中,你调用了一个方法,其中comp:ActiveTool()是语法糖,相当于comp.ActiveTool(comp),因此在调用pcall时需要考虑这一点:comp:ActiveTool() => pcall(comp.ActiveTool, comp)


1
这不会起作用。你需要使用comp.ActiveTool,同时将comp作为参数传递(以模拟comp:ActiveTool()的调用)。 - Paul Kulchenko
@PaulKulchenko 哎呀,是的。我当时专注于传递函数或其结果到 pcall 之间的差异。现在已经更改了示例以便更加关注这一点,并在下面澄清了有关方法调用的内容。 - Mud

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接