【发布时间】:2016-02-01 11:48:09
【问题描述】:
我想通过以下方式在我的包的__init__.py 文件中为 len 分配另一个函数:
llen = len
len = lambda x: llen(x) - 1
它工作正常,但只在__init__.py 文件中。如何让它影响我包中的其他模块?
【问题讨论】:
标签: python monkeypatching shadowing built-in
我想通过以下方式在我的包的__init__.py 文件中为 len 分配另一个函数:
llen = len
len = lambda x: llen(x) - 1
它工作正常,但只在__init__.py 文件中。如何让它影响我包中的其他模块?
【问题讨论】:
标签: python monkeypatching shadowing built-in
这可能不是你要找的答案,但如果我是你,我不会这样做(而且我很确定你不能轻易做到)。
您不应该这样做的原因是 python 在其对象内部使用len 来执行某些操作。
另一个原因是纯粹的逻辑错误。上面定义的 len 函数将为空列表或空事物返回 负长度。这对我来说似乎很糟糕。
您可以做的只是覆盖某些类的长度方法(这对您来说可能很有意义)。为此,您可以使用运算符重载,只需在您的类中覆盖方法__len__:
class MyList(object):
def __len__(self,):
# Do your thing
您可能还想查看元类,关于这个主题有一个非常好的stack overflow 问题。
【讨论】:
当您尝试加载未定义为模块级全局或函数本地的名称时,Python 会在 __builtin__(Python 3 中的builtins)模块中查找它。在两个版本的 Python 中,这个模块也可以在全局范围内以 __builtins__ 的形式使用。您可以修改此模块,这不仅会影响您的代码,还会影响任何在您的代码运行后运行的任何 python 代码!!
import __builtin__ as builtins # import builtins in python 3
llen = len
builtins.len = lambda a:llen(a) - 1
【讨论】:
__builtins__ 是 CPython 中的私有实现细节。 您应该显式导入 builtins 模块(或 Python 2 中的 __builtin__)。