检查传递给函数的函数

时间:2012-10-05 05:00:10

标签: python

我有一个函数将函数作为其参数之一,但是根据上下文,函数可以是几个中的一个(它们都是用于为sorted方法创建规则的比较器函数)。有没有办法检查哪个函数传递给函数?我在想的是某种类似的条件逻辑:

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

等。这会有用吗?在检查函数存在时,我是否需要传递函数的所有参数?有没有更好的办法?

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

>>> def hello_world():
...    print "hi"
...
>>> def f2(f1):
...    print f1.__name__
...
>>> f2(hello_world)
hello_world

重要的是要注意这只检查名称而不是签名..

答案 2 :(得分:1)

helperFunction==compareValues1

答案 3 :(得分: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的引用