1

関数を引数の1つとして取る関数がありますが、コンテキストに応じて、その関数はいくつかの関数の1つになる可能性があります(これらはすべて、sortedメソッドのルールを作成するためのコンパレータ関数です)。どの関数が関数に渡されたかを確認する方法はありますか?私が考えているのは、次のような条件付きロジックのようなものです。

def mainFunction (x, y, helperFunction):
    if helperFunction == compareValues1():
         do stuff
    elif helperFunction == compareValues2():
         do other stuff

など。これは機能しますか?関数の存在を確認するときに、関数のすべての引数を渡す必要がありますか?もっと良い方法はありますか?

4

4 に答える 4

3

あなたは正しい軌道に乗っています。これらの括弧を削除するだけです:

def mainFunction (x, y, helperFunction):
    if helperFunction == compareValues1():  <-- this actually CALLS the function!
         do stuff
    elif helperFunction == compareValues2():
         do other stuff

代わりに、あなたは望むでしょう

def mainFunction (x, y, helperFunction):
    if helperFunction is compareValues1:
         do stuff
    elif helperFunction is compareValues2:
         do other stuff
于 2012-10-05T05:09:58.047 に答える
2
>>> def hello_world():
...    print "hi"
...
>>> def f2(f1):
...    print f1.__name__
...
>>> f2(hello_world)
hello_world

これは署名ではなく名前のみをチェックすることに注意することが重要です..

于 2012-10-05T05:10:37.083 に答える
1
helperFunction==compareValues1
于 2012-10-05T05:00:59.763 に答える
0

関数自体がPythonのオブジェクトであるため、関数を関数に渡すと、参照がそのパラメーターにコピーされます。したがって、それらを直接比較して等しいかどうかを確認できます。

def to_pass():
    pass

def func(passed_func):
    print passed_func == to_pass   # Prints True
    print passed_func is to_pass   # Prints True

foo = func    # Assign func reference to a different variable foo
bar = func()  # Assigns return value of func() to bar..

foo(to_pass)  # will call func(to_pass)

# So, you can just do: - 

print foo == func   # Prints True

# Or you can simply say: - 
print foo is func   # Prints True

to_passしたがって、関数に渡すと、func()への参照がto_pass引数にコピーされますpassed_func

于 2012-10-05T05:03:41.577 に答える