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

Alo*_*nez 16 python authentication functional-programming callback python-2.7

我想知道如何正确使用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?
Run Code Online (Sandbox Code Playgroud)

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

如果我这样说:

 if member_of('admin'):
    do_something()
  else:
    do_something_else()
Run Code Online (Sandbox Code Playgroud)

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

你能告诉我这件事吗?如何确保执行回调?我该如何传递它呢?

mit*_*mit 15

在python中,与许多其他语言一样,变量也可以包含函数,您可以像包含例如数字或字符串的其他变量一样传递它们.

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

我用简单的步骤解释它:

如果你写member_of()它返回函数member_of()的结果,这是check在这种情况下具有名称的函数.

cb_function = member_of('admin')
Run Code Online (Sandbox Code Playgroud)

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

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

my_result =  cb_function()
Run Code Online (Sandbox Code Playgroud)

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

if my_result:
  # do something
  ...   
Run Code Online (Sandbox Code Playgroud)

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

cb_function = member_of('admin')
  if cb_function():
    # do something
    ...
Run Code Online (Sandbox Code Playgroud)

甚至更短:

if member_of('admin')():
  # do something
  ...  
Run Code Online (Sandbox Code Playgroud)

起初,在python中看起来有点奇怪()(),但是如果你考虑它一段时间它是有意义的.