如何在python中使用回调函数?

时间:2013-06-13 07:11:45

标签: python authentication python-2.7 callback functional-programming

我想知道如何正确使用python 2.7回调函数。

我的代码中有一些来自Cherrypy auth示例的回调函数。

(这些回调返回一个可以评估为True或False的函数,具体取决于登录用户是否在组中。)

我想知道如果我写了一段这样的代码,是否执行了回调:

鉴于图书馆的定义是:

def member_of(groupname):
    def check():
        if groupname == 'admin':
          if cherrypy.request.login == 'joe':
            return True
          if cherrypy.request.login == 'toni':
            return True
          return False
        return False
        # .... (other groups checked in the same way)
    return check # returns a callback function from my understanding?

如何在我的代码中应用和执行回调?

如果我这样说:

 if member_of('admin'):
    do_something()
  else:
    do_something_else()

这会执行calllback并检查管理员组吗?或者它会发现“member_of”的值是否是函数定义而函数定义可能总是“True”值(或者可能是False值)但两者都是错误的,因为它需要执行

你可以告诉我这件事吗?如何确保执行回调?我怎么能按原样传递它呢?

2 个答案:

答案 0 :(得分:15)

在python中,与许多其他语言一样,变量也可以包含一个函数,你可以像其他变量一样传递它们。数字或字符串。

CherryPy的member_of函数本身确实返回了一个函数。

我正在简单地解释它:

如果你写member_of(),它会返回函数member_of()的结果,在这种情况下,函数名为check

cb_function = member_of('admin')

此时变量cb_function保存调用函数member_of的结果,并在最后一行member_of返回check,它在函数{中定义} {1}}作为另一个功能!

你必须再次调用第一个结果,因为你可以和你必须以与你在当前上下文中定义的本地函数几乎相同的方式来处理它,以获得最终结果,通过这样做:

member_of

然后你会继续使用结果。例如,您可以检查其布尔值:

my_result =  cb_function()

上面的3个步骤可以写得更短:

if my_result:
  # do something
  ...   

甚至更短:

cb_function = member_of('admin')
  if cb_function():
    # do something
    ...

起初,在python中看起来有点奇怪的是有if member_of('admin')(): # do something ... ,但是如果你想一会儿它就有意义了。

答案 1 :(得分:3)

如果你执行它,很简单。

member_of()将返回方法对象检查。 你必须通过像member_of('admin')()这样的事情来执行以获得结果: 或者,

k=member_of('admin')
if k():

完成你的任务。