如何将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

我正在尝试将我从Python编写的一段代码翻译成Lua。我在合成包Blackmagic Fusion中使用此代码

任何帮助都将不胜感激

Python脚本(工作):

Lua脚本(仍不工作且出错):


您没有正确使用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)