Python中的嵌套函数
Python代码可以带来什么样的好处或意义:
class some_class(parent_class): def doOp(self, x, y): def add(x, y): return x + y return add(x, y)
我在一个开源项目中发现了这个,在嵌套函数中做了一些有用的事情,除了调用它之外什么都不做。 (实际的代码可以在这里find。)为什么有人可以这样编码? 在嵌套函数而不是外部正常函数中编写代码是否有一些好处或副作用?
通常你做它闭包 :
def make_adder(x): def add(y): return x + y return add plus5 = make_adder(5) print(plus5(12)) # prints 17
内部函数可以访问封闭范围内的variables(在本例中是局部variablesx
)。 如果你没有从封闭范围访问任何variables,它们实际上只是具有不同范围的普通函数。
除了函数发生器,其中内部函数创build几乎是函数发生器的定义,我创build嵌套函数的原因是为了提高可读性。 如果我有一个只能被外部函数调用的小函数,那么我就内联了这个定义,所以你不必跳过来确定这个函数在做什么。 如果我发现需要在以后重用函数,我总是可以将内部方法移动到封装方法之外。
玩具例子:
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()
使用内部方法的一个潜在的好处是它允许你使用外部方法局部variables而不用作为parameter passing它们。
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)
我无法想象这样的代码有什么好的理由。
也许在旧版本中有内部函数的原因,就像其他的Ops一样。
举个例子,这样做更有意义:
class some_class(parent_class): def doOp(self, op, x, y): def add(x, y): return x + y def sub(x,y): return x - y return locals()[op](x,y) some_class().doOp('add', 1,2)
但是内部函数应该是(“私有”)类方法:
class some_class(object): def _add(self, x, y): return x + y def doOp(self, x, y): return self._add(x,y)
本地方法背后的想法与局部variables相似:不要污染较大的名称空间。 显然,由于大多数语言不直接提供这种function,所以好处是有限的。
你确定代码完全是这样吗? 这样做的正常原因是创build一个部分 – 一个函数与烘焙参数。 调用外部函数将返回一个不需要参数的可调用对象,因此可以存储并在某个无法传递参数的地方使用。 然而,你发布的代码不会这样做 – 它立即调用函数并返回结果,而不是可调用的。 发布你看到的实际代码可能是有用的。