如何将Python脚本转换为Lua脚本?
我正在尝试将我从Python编写的一段代码翻译成Lua。我在合成包Blackmagic Fusion中使用此代码 任何帮助都将不胜感激 Python脚本(工作): Lua脚本(仍不工作且出错):如何将Python脚本转换为Lua脚本?,python,error-handling,lua,try-catch,blackmagic-fusion,Python,Error Handling,Lua,Try Catch,Blackmagic Fusion,我正在尝试将我从Python编写的一段代码翻译成Lua。我在合成包Blackmagic Fusion中使用此代码 任何帮助都将不胜感激 Python脚本(工作): Lua脚本(仍不工作且出错): 您没有正确使用pcall。您需要将实际需要调用的函数传递给它,它将在保护模式下调用它,从而捕获错误 pcall返回2个值,一个bool表示调用是否成功,如果调用未成功,则返回一个错误代码 您的lua代码应该更像这样: local ok, err = pcall(comp.ActiveTool, comp
您没有正确使用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
如果您想使用接受params的pcall调用函数,只需将它们作为附加值传递给pcall,它就会在调用时将这些值传递给您给它的方法
local ok, err = pcall(comp.AddTool, 'PolylineMask', -32768, -32768)
举个例子
上面这一行大致可以理解为:
try {
comp.AddTool('PolylineMask', -32768, -32768);
return true
}
catch (err) {
return false, err
}
请注意区别:
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
需要“尝试捕捉”
试一试{
函数()
错误('oops')
完,,
抓住{
函数(错误)
打印('捕获错误:'…错误)
结束
}
}
——try-catch.lua
函数捕获(什么)
返回什么[1]
结束
函数try(什么)
状态,结果=pcall(什么[1])
如果不是状态,那么
什么[2](结果)
结束
返回结果
结束
原稿感谢您的快速回复。我仍在努力弄清楚这里发生了什么。我已经更新了Lua代码,但仍然出错。我希望它运行这段代码“comp.AddTool('PolylineMask',-32768,-32768)”,而不是出错。我收到的错误消息是“尝试调用方法‘ActiveTool’(一个nil值)”,您声明的错误只是lua,表示
comp
对象上没有名为ActiveTool
的可用函数/属性。这可能有几个原因。如果没有看到更多与comp
对象相关的代码,我就无法帮助您解决这个问题。@user2528059,猜猜您想做什么,您可以使用local ok,err;如果comp.ActiveTool然后ok,err=false,“否则ok,err=pcall(comp:ActiveTool)end
…应该是pcall(comp.ActiveTool,comp)
,而不是pcall(comp:ActiveTool)
@PaulKulchenko谢谢,修复了。我已经有一段时间没有在Lua工作了=/这行不通。您需要使用comp.ActiveTool
并将comp
作为参数传递(以模拟comp:ActiveTool()
调用)。@PaulKulchenko Oops。是的,我关注的是将函数或其结果传递给pcall之间的区别。将示例更改为关注该问题,然后在下面对方法调用进行了说明。
pcall(tbl.method, tbl, arg1, arg2, ...)
local ok, err = pcall(comp.ActiveTool, comp)