Ed *_*d L 20 python coding-style
这是Python中的一个好习惯(来自Active State Recipes - Public Decorator)吗?
import sys
def public(f):
"""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
"""
all = sys.modules[f.__module__].__dict__.setdefault('__all__', [])
if f.__name__ not in all: # Prevent duplicates if run from an IDE.
all.append(f.__name__)
return f
public(public) # Emulate decorating ourself
Run Code Online (Sandbox Code Playgroud)
一般的想法是定义一个装饰器,它接受一个函数或类,并将其名称添加到__all__当前模块的名称.
lui*_*dro 17
在Python中执行此操作的更惯用的方法是通过使用下划线开始使用其名称将私有函数标记为私有:
def public(x):
...
def _private_helper(y):
...
Run Code Online (Sandbox Code Playgroud)
更多人会熟悉这种风格(语言也支持:_private_helper即使你不使用也不会导出__all__),而不是你的public装饰者.
是的,这是一个很好的做法.这个装饰器允许您在功能或类定义中陈述您的意图,而不是直接在之后.这使您的代码更具可读性.
@public
def foo():
pass
@public
class bar():
pass
class helper(): # not part of the modules public interface!
pass
Run Code Online (Sandbox Code Playgroud)
注意: helper模块的用户仍然可以访问modulename.helper.它只是没有导入from modulename import *.