gpt4 book ai didi

python - Python 闭包是 `__all__` 的良好替代品吗?

转载 作者:太空宇宙 更新时间:2023-11-03 12:29:48 27 4
gpt4 key购买 nike

使用闭包而不是 __all__ 来限制 Python 模块公开的名称是个好主意吗?这将防止程序员意外使用错误的模块名称 (import urllib; urllib.os.getlogin()) 以及避免“from x import *”命名空间污染为 __all__

def _init_module():
global foo
import bar
def foo():
return bar.baz.operation()
class Quux(bar.baz.Splort): pass
_init_module(); del _init_module

对比使用 __all__ 的同一模块:

__all__ = ['foo']
import bar
def foo():
return bar.baz.operation()
class Quux(bar.baz.Splort): pass

函数可以采用这种风格来避免污染模块命名空间:

def foo():
import bar
bar.baz.operation()

这对于想要帮助用户在交互式内省(introspection)期间将其 API 与包对其和其他模块的 API 的使用区分开来的大型包可能会有所帮助。另一方面,也许 IPython 应该在 Tab 完成期间简单地区分 __all__ 中的名称,更多用户应该使用允许他们在文件之间跳转以查看每个名称的定义的 IDE。

最佳答案

我热衷于编写尽可能简单到脑残的代码。

__all__ 是 Python 的一项功能,明确添加是为了解决限制模块可见的名称的问题。当您使用它时,人们会立即了解您在用它做什么。

你的闭包技巧很不规范,如果我遇到了,我不会马上理解的。您需要输入一个长注释来解释它,然后您需要输入另一个长注释来解释您为什么这样做而不是使用 __all__

编辑:现在我对问题的理解稍微好一点了,这里是另一个答案。

在 Python 中,在模块中使用下划线作为私有(private)名称前缀被认为是一种很好的做法。如果您执行 from the_module_name import *,您将获得所有不以下划线开头的名称。因此,与其使用闭包技巧,我更希望看到正确使用首字母下划线习语。

请注意,如果您使用开头的下划线名称,您甚至不需要使用 __all__

关于python - Python 闭包是 `__all__` 的良好替代品吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1632739/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com