这是 Python 标准库 inspect.py 中的一个示例。它目前读取
def strseq(object, convert, join=joinseq):
"""Recursively walk a sequence, stringifying each element."""
if type(object) in (list, tuple):
return join(map(lambda o, c=convert, j=join: strseq(o, c, j), object))
else:
return convert(object)
这有一个转换函数和一个连接函数作为参数,并递归遍历列表和元组。递归是使用 map() 实现的,其中第一个参数是一个函数。该代码早于 Python 中对闭包的支持,因此需要两个额外的默认参数,以将 convert 和 join 传递到递归调用中。使用闭包时,会显示
def strseq(object, convert, join=joinseq):
"""Recursively walk a sequence, stringifying each element."""
if type(object) in (list, tuple):
return join(map(lambda o: strseq(o, convert, join), object))
else:
return convert(object)
在 OO 语言中,您通常不会过于频繁地使用闭包,因为您可以使用对象来传递状态和绑定方法(如果您的语言有它们)。当 Python 没有闭包时,人们说 Python 用对象模拟闭包,而 Lisp 用闭包模拟对象。以 IDLE (ClassBrowser.py) 为例:
class ClassBrowser: # shortened
def close(self, event=None):
self.top.destroy()
self.node.destroy()
def init(self, flist):
top.bind("<Escape>", self.close)
这里,self.close 是按下 Escape 时调用的无参数回调。然而,close 实现确实需要参数——即 self,然后是 self.top,self.node。如果 Python 没有绑定方法,你可以写
class ClassBrowser:
def close(self, event=None):
self.top.destroy()
self.node.destroy()
def init(self, flist):
top.bind("<Escape>", lambda:self.close())
这里,lambda 不是从参数中获取“self”,而是从上下文中获取。