Python中的嵌套函数

Python中的嵌套函数,python,nested-function,Python,Nested Function,这样的Python代码有什么好处或意义: class some_class(parent_class): def doOp(self, x, y): def add(x, y): return x + y return add(x, y) 我在一个开源项目中发现了这一点,在嵌套函数内做了一些有用的事情,但在嵌套函数外除了调用它什么都不做。(可以找到实际的代码。)为什么有人会这样编码?在嵌套函数中而不是在外部的普通函数中编写代码有什

这样的Python代码有什么好处或意义:

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

我在一个开源项目中发现了这一点,在嵌套函数内做了一些有用的事情,但在嵌套函数外除了调用它什么都不做。(可以找到实际的代码。)为什么有人会这样编码?在嵌套函数中而不是在外部的普通函数中编写代码有什么好处或副作用吗?

我想不出这样编写代码的任何好理由

也许有一个原因,在旧版本的内部功能,像其他老年退休金计划

例如,这稍微有点道理:

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)

局部方法背后的思想类似于局部变量:不要污染更大的名称空间。显然,这些好处是有限的,因为大多数语言都不直接提供这样的功能。

您确定代码就是这样的吗?这样做的正常原因是创建带有烘焙参数的分部函数。调用外部函数返回一个不需要参数的可调用函数,因此可以在无法传递参数的地方存储和使用。但是,您发布的代码不会这样做-它会立即调用函数并返回结果,而不是可调用的。发布您看到的实际代码可能会很有用。

除了函数生成器之外,内部函数创建几乎就是函数生成器的定义,我创建嵌套函数的原因是为了提高可读性。如果我有一个只由外部函数调用的小函数,那么我将内联定义,这样您就不必跳过来确定该函数在做什么。如果以后需要重用函数,我总是可以将内部方法移到封装方法之外

玩具示例:

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

通常,您这样做是为了:


内部函数可以从封闭范围访问变量(在本例中,是局部变量
x
)。如果您没有从封闭范围访问任何变量,它们实际上只是具有不同范围的普通函数。

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

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)

是的,也许doOp使用了一个字符串来指定在参数上使用哪个操作符…@ArtOfWarfare它更倾向于使用模块。类代表状态。这是您找到的实际代码,还是您构造的简化示例?这是一个简化示例。实际代码可以在这里找到:您的链接(指向头部)现在不准确。试试看:你说得对,克雷格。谢谢。我更喜欢partials:
plus5=functools.partial(operator.add,5)
。Decorators是闭包更好的例子。谢谢,但正如您在我发布的代码片段中看到的,这里的情况并非如此:嵌套函数只是在外部函数中被调用。我在对我的问题的评论中添加了指向原始代码的链接。正如你所看到的,我的是一个简化的例子,但它仍然几乎是一样的。唯一的问题是,这有时会使单元测试变得更加困难,因为你无法访问内部函数。它们看起来非常可爱!FWIY@Challenger5如果内部函数类似于私有类函数,那么它们不会进行单元测试。我已经开始这样做,以使方法更具可读性,同时使定义接近所讨论的方法。
def save(item, resultBuffer):

  def helper(feature):
    resultBuffer.print(feature)
    resultBuffer.printLine()
    resultBuffer.flush()

  helper(item.description)
  helper(item.size)
  helper(item.type)