在 __init__.py 中覆盖 len - Python

8
我想在我的包的__init__.py文件中给len分配另一个功能,方法如下:
llen = len
len = lambda x: llen(x) - 1

它可以正常工作,但仅限于__init__.py文件中。我该如何使其影响我包中的其他模块?
2个回答

4

这可能不是你想要的答案,但如果我是你,我不会这样做(而且我相当确定你也不能轻易地这样做)。

你不应该这样做的原因是,Python 在其对象上内部使用 len 来执行某些操作。另一个原因是纯粹的错误逻辑。你上面定义的 len 函数将为空列表或空内容返回一个负长度。在我看来,这似乎很糟糕。

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

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

你可能还想研究元类,这个主题在stackoverflow上有一个非常好的问题。


我同意你的看法!我知道这种行为并不是很恰当。但是这段代码是我大学作业的一部分。我必须创建一个有着非常烦人且难以找到的错误的程序。我认为将某些不同的东西赋值给一个易于使用且经常使用的函数(例如len)是个好主意! :) - DorianOlympia

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

谢谢!对我来说运行得很顺利 :) - DorianOlympia
1
__builtins__是CPython中的私有实现细节。您应该明确导入builtins模块(或Python 2中的__builtin__)来代替。 - pppery

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接