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
).如果您没有从封闭范围访问任何变量,它们实际上只是具有不同范围的普通函数.
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)
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)
我无法想象代码的任何好理由.
也许在其他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)