在Python嵌套函数(Nested Function in Python)

2019-08-20 11:40发布

我们可以得到与Python代码这样有什么好处或影响:

class some_class(parent_class):
    def doOp(self, x, y):
        def add(x, y):
            return x + y
        return add(x, y)

我发现这在开源项目,做一些嵌套函数中很有用,但绝对做外,就只能一无所获,除了调用它。 (实际的代码,可以发现在这里 。)为什么会有人这样的代码呢? 是否有写嵌套函数中的代码,而不是在外部,正常功能有一定益处或副作用?

Answer 1:

通常情况下,你这样做是为了使关闭

def make_adder(x):
    def add(y):
        return x + y
    return add

plus5 = make_adder(5)
print(plus5(12))  # prints 17

内部函数可以从封闭范围(在这种情况下,局部变量访问变量x )。 如果你没有从封闭范围内访问任何变量,它们是属于不同范围的真的只是普通的功能。



Answer 2:

除了函数发生器,其中内部函数创建几乎是一个函数发生器的定义,我创建嵌套函数的原因是为了提高可读性。 如果我有一个只能由外部函数调用一个微小的功能,那么我内联定义,所以你不必四处跳跃,以确定什么功能正在做什么。 我可以随时移动内部方法的封装方法之外,如果我发现需要在以后重新使用该功能。

玩具例子:

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()


Answer 3:

使用内方法的一个潜在的好处是,它允许您使用外部方法的局部变量不用将它们作为参数。

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)


Answer 4:

我无法想象任何好的理由这样的代码。

也许有在老版本的内部函数,像其他行动的理由。

例如,这可以在某种程度上更有意义:

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)


Answer 5:

背后本地方法的思路是相似的局部变量:不污染较大的命名空间。 很明显的好处是有限的,因为大多数语言不还直接提供这样的功能。



Answer 6:

你确定代码正是这样吗? 正常的理由做这样的事情是建立一个部分 - 与烤入参数的函数。 调用外部函数返回不需要参数等因此可以被存储并用于某处是不可能的传递参数可调用。 但是,你已经发布的代码不会那么做的 - 它会立即调用函数,并返回结果,而不是调用。 这可能是有用的张贴您看到的实际代码。



文章来源: Nested Function in Python