gpt4 book ai didi

python - 管理 __all__ 的导出装饰器

转载 作者:太空狗 更新时间:2023-10-30 00:43:12 26 4
gpt4 key购买 nike

一个合适的 Python 模块会在 a list called __all__ 中列出所有的 public 符号.管理该列表可能很乏味,因为您必须将每个符号列出两次。当然有更好的方法,可能是using decorators所以人们只需将导出的符号注释为 @export

你会如何编写这样的装饰器?我确信有不同的方法,所以我希望看到几个包含足够信息的答案,以便用户可以将这些方法相互比较。

最佳答案

Is it a good practice to add names to __all__ using a decorator? , Ed L建议将以下内容包含在某些实用程序库中:

import sys

def export(fn):
"""Use a decorator to avoid retyping function/class names.

* Based on an idea by Duncan Booth:
http://groups.google.com/group/comp.lang.python/msg/11cbb03e09611b8a
* Improved via a suggestion by Dave Angel:
http://groups.google.com/group/comp.lang.python/msg/3d400fb22d8a42e1
"""
mod = sys.modules[fn.__module__]
if hasattr(mod, '__all__'):
name = fn.__name__
all_ = mod.__all__
if name not in all_:
all_.append(name)
else:
mod.__all__ = [fn.__name__]
return fn

我们修改了名称以匹配其他示例。在本地实用程序库中使用它,您只需编写

from .utility import export

然后开始使用@export。只有一行惯用的 Python,没有比这更简单的了。不利的一面是,模块确实需要使用 __module__ 属性和 sys.modules 缓存来访问模块,这两者可能在一些更深奥的设置中存在问题(例如自定义导入机制,或包装来自另一个模块的函数以在该模块中创建函数)。

The python partatpublic package通过 Barry Warsaw做类似的事情。它也提供一些基于关键字的语法,但装饰器变体依赖于上面使用的相同模式。

This great answer通过 Aaron Hall建议一些非常相似的东西,多两行代码,因为它不使用 __dict__.setdefault。如果由于某种原因操作模块 __dict__ 出现问题,这可能更可取。

关于python - 管理 __all__ 的导出装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41895077/

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