list()给出TypeError:'Node'对象不可调用 - 但仅在某些代码之后

时间:2013-12-26 02:20:20

标签: python nuke

我希望这对你们来说很容易。

这是我的剧本,为Nuke。

selNodes = nuke.selectedNodes()

for list in selNodes:
    if list.Class() == 'Read':
        layerArray = []
        # Get the list of layers and make unique using set
        for chanList in list.channels():
            channelLayer = chanList.split('.')
            layerArray.append(channelLayer[0])

        print list(set(layerArray))

它出错了:

Traceback (most recent call last):
  File "<string>", line 11, in <module>
TypeError: 'Node' object is not callable

所以我尝试了一个性质相同的简单代码:

a = [1, 1]
print list(set(a))

它不起作用。相同的错误消息。现在这是奇怪的事情:我开了一个新的Nuke并再次运行更简单的代码,它起作用了。我不明白为什么,但我很高兴。所以我输入原始代码并运行它,错误消息。我删除了它们,编辑器现在很干净。并再次运行更简单的代码,错误消息!!

这意味着在粘贴和删除其他内容后,工作代码可能会失败!

有人能解释一下这个问题吗? Nuke是一个非常成熟的软件,我不知道它是否是一个软件错误。

1 个答案:

答案 0 :(得分:2)

这是因为,您使用list作为循环变量,它隐藏了内置函数list。您正在

中使用该功能
print list(set(layerArray))

即使循环结束,循环变量也会泄漏,请检查此程序以便更好地理解

for i in range(10):
    pass
print(i)

这将打印9。这意味着,即使在循环结束后,程序中仍然可以使用i。迭代selNodeslist变量后,程序中的大小写具有最后一个变量。当你说

时,你试图将其称为函数
print list(set(layerArray))

这就是它失败的原因。有两种方法可以解决这个问题。

  1. 只需将循环变量更改为其他内容。

  2. 循环结束时使用del list假装我没有建议这样做。建议使用 NOT 。只需将循环变量更改为其他内容即可。