如何将 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
注意区别:
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)。
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)
-- 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 函数是一个包含有一个匿名函数的表。这个匿名函数会将接收到的异常信息打印出来。
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
你没有正确使用 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 }