我想通过以下方式在我的包的__init__.py
文件中为len分配另一个函数:
llen = len
len = lambda x: llen(x) - 1
它工作正常,但仅限于__init__.py
文件。如何让它影响我的包中的其他模块?
答案 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