我是一名蟒蛇初学者。当我尝试在下面实现BinarySearchTree时,我收到以下错误
// omitted init. of functions
import * as express from 'express';
const cors = require('cors')({origin: true});
const app = express();
app.use(cors);
// The function to test
app.get('helloWorld, (req, res) => {
res.send('hello world');
return 'success';
});
exports.app = functions.https.onRequest(app);
非常感谢任何帮助。谢谢!
exec(code, run_globals)
File "binarysearchtree.py", line 23, in <module>
print(BinarySearchTree.contains(n2,3))
TypeError: contains() missing 1 required positional argument: 'value'
答案 0 :(得分:2)
问题是您已将方法定义为staticmethod
,但之后您尝试将其用作常规方法。
使用常规方法,当您执行obj.meth(a, b)
时,它会调用Cls.meth(obj, a, b)
,将obj
值作为self
参数。
使用静态方法,obj.meth(a, b)
只需调用Cls.meth(a, b)
。没有self
参数。
因此,错误是因为您要求self, root, value
但仅传递root, value
。正如例外所说的那样,你只有一个论点。
同时,你正试图在方法体中使用self
,所以你不能只是摆脱它。
如果你真的希望这是一个静态方法在树上,因为你实际上用self
实际做的唯一事情就是在类上调用static方法,你可以显式使用类名,如下所示:
@staticmethod
def contains(root, value):
if (root is None):
return None
elif (root.value==value):
return root
elif (root.value < value):
BinarySearchTree.contains(root.right,value)
else:
BinarySearchTree.contains(root.left,value)
然后你的代码就可以了。好吧,它会摆脱那个例外;它仍然有其他错误(比如没有将递归调用的结果返回到链中)。
但我不明白为什么你想要一个静态方法。
我的猜测是,你正在尝试移植基本上是ML-translated-to-Java设计的东西。在Java中,将一堆免费函数放在无用的类中算作OO。在Python中,您不需要这样做;你只需要在模块上有自由功能。除了混乱之外,静态方法并没有真正给你任何额外的东西。
或者您可以将其转换为OO。例如,如果合并树和节点类型(或将树转换为传递方法的根的节点句柄),则可以使contains
成为完全正常的方法。然后你必须在每次递归调用之前而不是在顶部进行None
检查,但就是这样。