16

我想知道如何正确使用 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()

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

你能启发我吗?如何确保执行回调?我怎样才能按原样传递它?

4

2 回答 2

15

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

CherryPy 的member_of函数本身在您的示例中确实返回了一个函数。

我用简单的步骤解释它:

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

cb_function = member_of('admin')

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

您必须再次调用第一个结果,因为您可以并且必须以几乎与在当前上下文中定义的本地函数相同的方式对待它,以获得最终结果,方法是:

my_result =  cb_function()

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

if my_result:
  # do something
  ...   

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

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

甚至更短:

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

起初,在 python 中拥有 double 可能看起来有点奇怪()(),但如果你仔细想想它是有道理的。

于 2013-08-21T10:06:45.160 回答
3

如果你执行它,它很简单。

member_of()将返回方法对象检查。您必须通过执行 if member_of('admin')(): 或,

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

去做你的任务。

于 2013-06-13T07:29:23.133 回答