Python中的嵌套函数
这段Python代码有什么好处或者影响呢:
class some_class(parent_class):
def doOp(self, x, y):
def add(x, y):
return x + y
return add(x, y)
我在一个开源项目中发现了这个代码,它在一个嵌套函数里做了一些有用的事情,但在外面却什么都不做,只是调用了这个嵌套函数。(实际代码可以在这里找到。)为什么有人会这样写代码呢?把代码放在嵌套函数里而不是放在外面的普通函数里,有什么好处或者副作用吗?
7 个回答
27
使用内部方法的一个潜在好处是,你可以直接使用外部方法里的局部变量,而不需要把它们作为参数传递。
def helper(feature, resultBuffer):
resultBuffer.print(feature)
resultBuffer.printLine()
resultBuffer.flush()
def save(item, resultBuffer):
helper(item.description, resultBuffer)
helper(item.size, resultBuffer)
helper(item.type, resultBuffer)
可以这样写,这样看起来可能更清晰。
def save(item, resultBuffer):
def helper(feature):
resultBuffer.print(feature)
resultBuffer.printLine()
resultBuffer.flush()
helper(item.description)
helper(item.size)
helper(item.type)
63
除了函数生成器这种情况,内部函数的创建几乎就是函数生成器的定义,我创建嵌套函数的原因是为了提高可读性。如果我有一个小函数,它只会被外部函数调用,那么我就把这个小函数的定义放在外面,这样你就不用到处跳来跳去去弄清楚这个函数在干什么。如果以后我发现需要重复使用这个内部函数,我可以随时把它移到外面。
举个简单的例子:
import sys
def Foo():
def e(s):
sys.stderr.write('ERROR: ')
sys.stderr.write(s)
sys.stderr.write('\n')
e('I regret to inform you')
e('that a shameful thing has happened.')
e('Thus, I must issue this desultory message')
e('across numerous lines.')
Foo()
120
通常你这样做是为了创建 闭包:
def make_adder(x):
def add(y):
return x + y
return add
plus5 = make_adder(5)
print(plus5(12)) # prints 17
内部函数可以访问外部范围的变量(在这个例子中,就是局部变量 x
)。如果你没有访问外部范围的任何变量,那么它们其实就是普通的函数,只是作用范围不同而已。