这变成了一个不同选项的列表,而不是一个直接的答案。然而,有两个概念是最重要的:
- 用户应该能够替换
range 和xrange 如果他们明确选择;但是
- 用户不应隐式/意外替换
range和xrange;
读者应该始终清楚他们的代码在哪里使用内置函数以及在哪里使用替换。
因此,我在下面概述的所有选项防止通配符导入 (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 和 inclusive.xrange;
-
from inclusive import range, xrange,明显替换了内置,没有任何不愉快的副作用;或
-
from inclusive import range as irange, xrange as ixrange 一起使用内置版本和替换版本。
将__all__ 定义为一个空列表意味着from inclusive import * 不会悄悄地隐藏内置函数。
如果你真的想要,你可以添加:
irange, ixrange = range, xrange
到inclusive.py 的末尾并将__all__ 定义修改为:
__all__ = ['irange', 'ixrange']
现在用户有两个额外的选择:
-
from inclusive import irange, ixrange(比上面选项 3 中的手动别名功能稍微简单一些);和
-
from inclusive import *(与上面的结果相同,仍然没有隐式隐藏内置函数)。
当然,您可以完全采用其他方式 - 将您自己的版本命名为 irange 和 ixrange,然后如果用户真的想要替换内置插件,他们将不得不:
from inclusive import irange as range, ixrange as xrange
这不需要您定义 __all__ 以避免通配符导入遮蔽内置函数。