我正在尝试设置一个函数来做这样的事情
def __binaryTreeInsert(self, toInsert, currentNode=getRoot(), parentNode=None):
当前节点以root用户身份启动,然后我们将其更改为方法中的其他节点,然后再次再次调用它。
但是,我无法让'currentNode = getRoot()'工作。如果我尝试调用funcion getRoot()(如上所述)它表示我没有给它所有必需的变量,但如果我尝试调用self.getRoot()它抱怨self是一个未定义的变量。有没有办法可以在调用此方法时不必指定根目录?
编辑:此方法的基本情况已经
if currentNode == None:
所以使用它来设置根本不起作用
答案 0 :(得分:2)
虽然arg=None
是非提供参数的惯用Python标记值,但 不是None
。例如,在Lua中,惯用的非提供参数是一个空表。我们实际上可以将其应用于这种情况:
class Foo:
sentinel = {}
def bar(self, arg=sentinel):
if arg is self.sentinel:
print "You didn't supply an argument!"
else:
print "The argument was", arg
f = Foo()
f.bar(123)
f.bar()
f.bar(None)
f.bar({})
输出:
The argument was 123 You didn't supply an argument! The argument was None The argument was {}
除了明确传递Foo.sentinel
之外,这适用于任何情况,因为Foo.sentinel
保证具有唯一地址 - 这意味着x is Foo.sentinel
仅时为真x 是 Foo.sentinel
:)因此,由于我们在Foo.sentinel
周围创建的闭包,只有一个对象可以创建一个模糊的情况,它永远不会意外使用。
答案 1 :(得分:0)
你可以做到
def __binaryTreeInsert(self, toInsert, currentNode=None, parentNode=None):
if currentNode is None:
currentNode = self.getRoot()
...
答案 2 :(得分:0)
定义函数或方法时,会立即评估def
行,包括任何关键字参数。因此,函数调用和可变对象之类的东西通常不适用于默认参数。
解决方案是使用sentinel值。 None
是最常见的,但对于None
是有效值的情况,您可以使用其他标记,例如:
not_provided = object()
def _binaryTreeInsert(self, toInsert, currentNode=not_provided, parentNode=None):
if currentNode is not_provided:
currentNode = self.getRoot()
答案 3 :(得分:-1)
def __binaryTreeInsert(self, toInsert, currentNode=0, parentNode=None):
if not currentNode:
currentNode = self.getRoot()