可以重用Python内置函数的名称吗?

use*_*783 5 python naming-conventions

正如目前在这个问题中讨论的那样,我正在编写内置函数rangexrange函数的包容性版本.如果将它们放在名为的模块中inclusive,我会看到两种可能的方法来命名函数本身:

  1. 命名函数inclusive_range,inclusive_xrange以便客户端代码可以使用它们,如下所示:

    from inclusive import *
    ...
    inclusive_range(...)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 命名函数rangexrange:

    import inclusive
    ...
    inclusive.range(...)
    
    Run Code Online (Sandbox Code Playgroud)

对我来说,客户端代码的第二个示例看起来更好,但是我应该避免以这种方式重用内置名称吗?

jon*_*rpe 5

这变成了一系列不同的选项,而不是一个直接的答案。然而,有两个概念至关重要:

  • 用户应该能够更换range并且xrange 如果他们明确选择的话;但
  • 用户不应该能够隐式/意外地替换 rangeand 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
    ...
Run Code Online (Sandbox Code Playgroud)

这允许用户:

  1. import inclusive并访问inclusive.rangeinclusive.xrange
  2. from inclusive import range, xrange,明显替换了内置函数,没有任何令人不快的副作用;或者
  3. from inclusive import range as irange, xrange as ixrange一起使用内置版本和替换版本。

定义__all__为空列表意味着from inclusive import * 不会悄悄地隐藏内置函数。


如果你真的愿意,你可以添加:

irange, ixrange = range, xrange
Run Code Online (Sandbox Code Playgroud)

到末尾inclusive.py并将定义修改__all__为:

__all__ = ['irange', 'ixrange']
Run Code Online (Sandbox Code Playgroud)

现在用户有两个额外的选择:

  • from inclusive import irange, ixrange(比上面选项 3 中手动为函数添加别名稍微简单一些);和
  • from inclusive import *(与上面的结果相同,仍然没有内置的隐式阴影)。

当然,您可以完全采用其他方式 - 命名您自己的版本irangeixrange然后如果用户确实想要替换内置插件,他们将必须:

from inclusive import irange as range, ixrange as xrange
Run Code Online (Sandbox Code Playgroud)

这不需要您进行定义__all__以避免通配符导入遮蔽内置函数。