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

如何在python中使用回调函数?,python,authentication,python-2.7,callback,functional-programming,Python,Authentication,Python 2.7,Callback,Functional Programming,我想知道如何正确使用Python2.7回调函数 我的代码中有一些来自Cherrypy auth示例的回调函数 (这些回调返回一个函数,该函数的计算结果可以为True或False,具体取决于登录用户是否在组中。) 我想知道如果我写了这样一段代码,是否会执行回调: if member_of('admin'): do_something() else: do_something_else() 鉴于图书馆的定义是: def member_of(groupname): de

我想知道如何正确使用Python2.7回调函数

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

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

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

 if member_of('admin'):
    do_something()
  else:
    do_something_else()
鉴于图书馆的定义是:

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()
这会执行callback并检查admin组吗?或者它会发现“member_of”的值是否是一个函数定义,而函数定义可能总是一个“True”值(或者可能是False值),但两者都是错误的,因为它需要执行


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

如果你执行它,那就很简单了

member\u of()
将返回方法对象检查。 您必须通过执行类似于if
member\u of('admin')()
的操作来获得结果: 或者


执行任务。

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

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

我用简单的步骤来解释:

如果写入
member\u of()
,它将返回函数member\u 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
  ...   
以上三个步骤可以写得更短:

cb_function = member_of('admin')
  if cb_function():
    # do something
    ...
if member_of('admin')():
  # do something
  ...  
甚至更短:

cb_function = member_of('admin')
  if cb_function():
    # do something
    ...
if member_of('admin')():
  # do something
  ...  
起初,在python中使用双精度
()
,似乎有点奇怪,但是如果您考虑一下,它是有意义的