Python中的嵌套函数

90 投票
7 回答
95863 浏览
提问于 2025-04-15 15:10

这段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)。如果你没有访问外部范围的任何变量,那么它们其实就是普通的函数,只是作用范围不同而已。

撰写回答