8

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

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

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

4

2 回答 2

4

这可能不是您要寻找的答案,但如果我是您,我不会这样做(而且我很确定您不能轻易做到)。

您不应该这样做的原因是 pythonlen在内部使用它的对象来执行某些操作。另一个原因是纯粹的逻辑错误。您len上面定义的函数将为空列表或空事物返回负长度。这对我来说似乎很破碎。

可以做的是仅在某些类上覆盖 length 方法(这对您来说可能很有意义)。为此,您可以使用运算符重载,只需覆盖__len__类中的方法:

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

您可能还想查看元类,关于这个主题有一个非常好的堆栈溢出问题。

于 2015-11-01T16:36:47.510 回答
2

当您尝试加载未定义为模块级全局或函数本地的名称时,Python 在__builtin__builtins在 Python 3 中)模块中查找它。在两个版本的 Python 中,这个模块也像__builtins__在全局范围内一样可用。您可以修改此模块,这不仅会影响您的代码,还会影响代码运行后运行的任何 python 代码!

import __builtin__ as builtins # import builtins in python 3
llen = len
builtins.len = lambda a:llen(a) - 1
于 2015-11-05T12:55:25.510 回答