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_passpassed_func

于 2012-10-05T05:03:41.577 回答