Python中的嵌套函数

Hos*_*Aly 78 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)
Run Code Online (Sandbox Code Playgroud)

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

Ada*_*eld 105

通常你这样做是为了关闭:

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

plus5 = make_adder(5)
print(plus5(12))  # prints 17
Run Code Online (Sandbox Code Playgroud)

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

  • 为此,我更喜欢偏序:`plus5 = functools.partial(operator.add,5)`.装饰器将是闭包的更好示例. (4认同)
  • 谢谢,但正如你在我发布的片段中看到的那样,这不是这种情况:嵌套函数只是在外部函数中被调用. (3认同)

Ros*_*ers 53

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

玩具示例:

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()
Run Code Online (Sandbox Code Playgroud)

  • 唯一的问题是,这有时会使单元测试变得更难,因为您无法访问内部函数. (4认同)
  • 他们看起来真可爱! (2认同)

Kub*_*uba 24

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

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)
Run Code Online (Sandbox Code Playgroud)

可写如下,可以说更好

def save(item, resultBuffer):

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

  helper(item.description)
  helper(item.size)
  helper(item.type)
Run Code Online (Sandbox Code Playgroud)


Joc*_*zel 8

我无法想象代码的任何好理由.

也许在其他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)
Run Code Online (Sandbox Code Playgroud)

但是内部函数应该是("私有")类方法:

class some_class(object):
    def _add(self, x, y):
        return x + y
    def doOp(self, x, y):
        return self._add(x,y)
Run Code Online (Sandbox Code Playgroud)

  • 你不应该只使用python中的类来组织函数... (4认同)

avg*_*nko 6

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