这就变成了一系列不同的选择,而不是一个直截了当的答案。然而,有两个概念至关重要:如果用户明确选择,那么用户应该能够替换range和xrange;但是
用户不应该隐式/意外地替换range和{}
对于代码的读者来说,应该始终清楚地知道在哪里使用了内建,在哪里使用了替换。在
出于这个原因,我在下面列出的所有选项都会阻止通配符导入(from inclusive import *)隐藏内置项。哪个是您的最佳选择取决于您将替换内置模块视为模块的主要用途还是次要用途。用户一般是想替换内置的,还是一起使用?在
在你的立场上,我想我会做以下事情:
inclusive.py:"""Inclusive versions of range and xrange."""
__all__ = [] # block 'from inclusive import *'
old_range, old_xrange = range, xrange # alias for access
def range(...): # shadow the built-in
...
def xrange(...): # ditto
...
这允许用户:import inclusive和访问inclusive.range和{}
from inclusive import range, xrange,清楚地替换了内置组件,没有任何不愉快的副作用;或者
from inclusive import range as irange, xrange as ixrange将内置版本和替换版本一起使用。在
将__all__定义为空列表意味着from inclusive import *不会悄悄地隐藏内置项。在
如果你真的想要,你可以加上:
^{pr2}$
到inclusive.py的结尾,并将__all__定义修改为:__all__ = ['irange', 'ixrange']
现在用户有两个额外的选择:from inclusive import irange, ixrange(比上面的选项3中手动设置函数别名要简单一些);以及
from inclusive import *(与上面的结果相同,仍然没有隐藏的内置阴影)。在
当然,您可以完全相反-命名您自己的版本irange和{},那么如果用户真的希望替换内置组件,他们必须:from inclusive import irange as range, ixrange as xrange
这不需要您定义__all__来避免使用通配符导入来隐藏内置。在