1

このようなことをする関数を設定しようとしています

   def __binaryTreeInsert(self, toInsert, currentNode=getRoot(), parentNode=None):

ここで、現在のノードはルートとして開始され、メソッド内でそれを別のノードに変更し、再帰的に再度呼び出します。

ただし、「currentNode=getRoot()」を機能させることができません。関数 getRoot() (上記のように) を呼び出そうとすると、必要な変数がすべて渡されていないと表示されますが、self.getRoot() を呼び出そうとすると、self が未定義の変数であると不平を言います。このメソッドを呼び出すときにルートを指定せずにこれを行う方法はありますか?

EDIT:このメソッドのベースケースはすでに

if currentNode == None:

それを使用してルートを設定しても機能しません

4

4 に答える 4

2

whilearg=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({})

出力:

引数は123でした
引数が指定されていません!
引数はなしでした
引数は {} でした

は一意のアドレスを持つことが保証されているFoo.sentinelため、これは明示的に を渡す場合を除いてどのような場合でも機能します。つまり、 x:)の場合にのみtrue になります。あいまいな状況であり、偶然に使用されることはありません。Foo.sentinelx is Foo.sentinel Foo.sentinelFoo.sentinel

于 2010-03-14T18:57:18.003 に答える
0

できるよ

def __binaryTreeInsert(self, toInsert, currentNode=None, parentNode=None):
   if currentNode is None:
      currentNode = self.getRoot()

...
于 2010-03-14T18:44:49.733 に答える
0

関数またはメソッドが定義されると、defキーワード引数を含めて、行がすぐに評価されます。このため、関数呼び出しや変更可能なオブジェクトなどは通常、既定の引数には適していません。

解決策は、代わりにセンチネル値を使用することです。Noneが最も一般的Noneですが、有効な値になる場合には、別のセンチネルを使用できます。次に例を示します。

not_provided = object()
def _binaryTreeInsert(self, toInsert, currentNode=not_provided, parentNode=None):
    if currentNode is not_provided:
        currentNode = self.getRoot()
于 2010-03-14T19:00:57.917 に答える
-1
def __binaryTreeInsert(self, toInsert, currentNode=0, parentNode=None):
    if not currentNode: 
        currentNode = self.getRoot()
于 2010-03-14T18:46:04.843 に答える