def wrapper(): filename = 'enclosed.py' def show_filename(): return 'filename {0}'.format(filename) print foo.call_func(show_filename)
# -*- coding:utf-8 -*- # Author: suke # At 2015/11/10 16:01 import foo # 导入foo.py # func.py filename = 'func.py' def showt_filename(): return 'filename: %s' % filename if __name__ == '__main__': # 实际调用的位置是在foo.call_func函数中 # 结果 filename: func.py # 很显然show_filename()函数使用的filename变量的值, # 是在与它相同环境(func.py模块)中定义的那个。 # 尽管foo.py模块中也定义了同名的filename变量, # 而且实际调用show_filename的位置也是在foo.py的call_func内部。 print foo.call_func(showt_filename)
def wrapper(): filename = 'enclose.py' def show_filename(): return 'filename: %s' % filename print foo.call_func(show_filename) # 输出 filename: enclose.py
def wrapper(): fileename ="enclosed.py" def show_filename(): return "filename: %s"%filename print(foo.call_func(show_filename)) # 输出:filename:enclosed.py
# 听上去的确有些复杂,还是用一个例子来帮助理解一下,假设我们在foo.py模块中做了如下定义: filename = "foo.py" def call_func(f): return f() # 如前面介绍的,f引用一个函数对象,然后调用它 # 在另一个func.py模块中,写下了这样的代码: import foo filename = "func.py" def show_filename(): return "filename:%s" % filename if __name__ == "__name__": print(foo.call_func(show_filename)) # 注意:实际发生调用的位置,是在foo.call_func函数中 # 当我们用python func.py命令执行func.py时输出结果为: # python func.py # 很显然show_filename()函数使用的filename变量的值,是在与它相同环境(func.py模块)中定义的那个。尽管 # foo.py模块中也定义了同名的filename变量,而且实际调用show_filename的位置也是在foo.py的call_func内部 # 而对于嵌套函数,这一机制则会表现的更加明显:闭包将会捕捉内层函数执行所需的整个环境: # 而对于嵌套函数,这一机制则会表现的更加明显:闭包将会捕捉内层函数执行所需的整个环境: # enclosed.py import foo def wrapper(): fileename ="enclosed.py" def show_filename(): return "filename: %s"%filename
#encoding:utf-8 import foo filename = 'func.py' def show_filename(): return 'filename: {0}'.format(filename) if __name__ == '__main__': print foo.call_func(show_filename)