在当地价值上结账

问题描述 投票:0回答:1

我读到以下内容 谷歌的Python风格指南:

"避免嵌套函数或类,除非 逾额收盘".

什么叫 "平仓超过局部价值"?

完整的相关章节如下。

2.6 NestedLocalInner类和函数。

嵌套的局部函数或类在用于关闭局部变量时是可以的。内嵌类也可以。

2.6.1 定义

一个类可以定义在一个方法、函数或类的内部。一个函数可以定义在一个方法或函数的内部。嵌套函数对在外层作用域中定义的变量有只读访问权。

2.6.2 优点

允许定义仅在一个非常有限的范围内使用的实用类和函数。非常ADT-y。常用于实现装饰器。

2.6.3 Cons

嵌套类或本地类的实例不能被腌制。嵌套的函数和类不能直接测试。嵌套会使你的外层函数变长,可读性降低。

2.6.4 决策

它们是可以的,但有一些注意事项。避免嵌套函数或类,除非在本地值上关闭。不要为了向模块的用户隐藏一个函数而嵌套它。取而代之的是,在模块级别上用 _ 前缀它的名字,这样它仍然可以被测试访问。

python styles inner-classes nested-function google-style-guide
1个回答
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)
© www.soinside.com 2019 - 2024. All rights reserved.