覆盖__init__.py中的len - python

时间:2015-11-01 14:37:21

标签: python monkeypatching shadowing built-in

我想通过以下方式在我的包的__init__.py文件中为len分配另一个函数:

llen = len
len = lambda x: llen(x) - 1

它工作正常,但仅限于__init__.py文件。如何让它影响我的包中的其他模块?

2 个答案:

答案 0 :(得分:4)

这可能不是您正在寻找的答案,但如果我是您,我也不会这样做(而且我非常确定您无论如何都不容易)。

你不应该因为python在其内部使用len来执行某些操作。 另一个原因是纯粹的破坏逻辑。上面定义的len函数会为空列表或空字符返回负长度。这对我来说似乎很不妥。

可以做什么,只在某些类上覆盖长度方法(这可能对你很有意义)。为此,您可以使用运算符重载,只需覆盖类中的方法__len__

class MyList(object):
    def __len__(self,):
        # Do your thing

您可能还想查看元类,对此主题有一个非常好的stack overflow问题。

答案 1 :(得分:2)

当您尝试加载未定义为模块级全局或函数本地的名称时,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