我读到以下内容 谷歌的Python风格指南:
"避免嵌套函数或类,除非 逾额收盘".
什么叫 "平仓超过局部价值"?
完整的相关章节如下。
2.6 NestedLocalInner类和函数。
嵌套的局部函数或类在用于关闭局部变量时是可以的。内嵌类也可以。
2.6.1 定义
一个类可以定义在一个方法、函数或类的内部。一个函数可以定义在一个方法或函数的内部。嵌套函数对在外层作用域中定义的变量有只读访问权。
2.6.2 优点
允许定义仅在一个非常有限的范围内使用的实用类和函数。非常ADT-y。常用于实现装饰器。
2.6.3 Cons
嵌套类或本地类的实例不能被腌制。嵌套的函数和类不能直接测试。嵌套会使你的外层函数变长,可读性降低。
2.6.4 决策
它们是可以的,但有一些注意事项。避免嵌套函数或类,除非在本地值上关闭。不要为了向模块的用户隐藏一个函数而嵌套它。取而代之的是,在模块级别上用 _ 前缀它的名字,这样它仍然可以被测试访问。
它的意思是除非你创建一个闭包。闭包是指当一个自由变量引用一个包围作用域中的变量。所以举个例子。
def foo():
bar = 42
def baz():
print(bar)
return baz
foo()()
这将打印 42
因为 baz
是对变量的封闭 bar
在当地范围内 foo
. 注意,你甚至可以反省这个问题。
f = foo()
print(f.__closure__)
所以,本质上,指南是告诉你 只有当一个嵌套函数对某些事情有用的时候才使用它, 一个小的例子可以是一个函数工厂。
def make_adder(n):
def add(x):
return n + x
return add
add2 = make_adder(2)
add5 = make_adder(5)
print(add2(1), add5(1))
add2
和... add5
是关闭超过 n
.
有些人可能会想嵌套一个函数 仅仅 来隐藏它的全局范围,比如说。
def foo(n):
def frobnicate(x, y):
return x + y
m = n + 42
return frobnicate(m, 11)
风格指南说不要这样做,只是做。
def frobnicate(x, y):
return x + y
def foo(n):
m = n + 42
return frobnicate(m, 11)