关闭本地值

Jos*_*osh 2 python styles inner-classes nested-function google-style-guide

我在Google 的 Python styleguide 中阅读了以下内容

“除非关闭本地值,否则避免嵌套函数或类”。

“关闭本地值”是什么意思?

完整的相关部分如下:

2.6 嵌套/本地/内部类和函数

当用于关闭局部变量时,嵌套局部函数或类很好。内部课程很好。

2.6.1 定义

类可以在方法、函数或类中定义。函数可以在方法或函数中定义。嵌套函数对封闭作用域中定义的变量具有只读访问权限。

2.6.2 优点

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

2.6.3 缺点

嵌套或本地类的实例不能被腌制。嵌套的函数和类不能直接测试。嵌套可以使您的外部函数更长且可读性更低。

2.6.4 决定

他们没有问题,但有一些警告。避免嵌套函数或类,除非关闭本地值。不要嵌套函数只是为了对模块的用户隐藏它。相反,在模块级别用 _ 前缀它的名称,以便它仍然可以被测试访问。

jua*_*aga 5

这意味着除非你创建一个闭包。闭包是指自由变量引用封闭范围内的变量。例如:

def foo():
    bar = 42
    def baz():
        print(bar)
    return baz
foo()()
Run Code Online (Sandbox Code Playgroud)

这将打印42,因为bazbar的局部范围内的变量的闭包foo。请注意,您甚至可以反省这一点:

f = foo()
print(f.__closure__)
Run Code Online (Sandbox Code Playgroud)

所以,本质上,指南告诉你只有当嵌套函数对某些东西真正有用时才使用它,一个人为的小例子可能是函数工厂:

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

add2并且add5正在关闭n

有些人可能只想嵌套一个函数只是为了将它隐藏在全局范围之外,例如:

def foo(n):

    def frobnicate(x, y):
        return x + y

    m = n + 42
    return frobnicate(m, 11)
Run Code Online (Sandbox Code Playgroud)

风格指南说不要那样做,只要做:

def frobnicate(x, y):
    return x + y

def foo(n):
    m = n + 42
    return frobnicate(m, 11)
Run Code Online (Sandbox Code Playgroud)