【问题标题】:Overriding len in __init__.py - python在 __init__.py 中覆盖 len - python
【发布时间】:2016-02-01 11:48:09
【问题描述】:

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

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

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

【问题讨论】:

    标签: python monkeypatching shadowing built-in


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 我同意你的看法!我知道这样的行为并不合适。但这段代码是我大学作业的一部分。我必须创建一个非常烦人且难以找到错误的程序。我认为将一些不同的东西分配给一个简单且经常使用的函数(例如 len)是一个好主意! :)
    【解决方案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
    

    【讨论】:

    • 谢谢!对我来说工作得很好:)
    • __builtins__ 是 CPython 中的私有实现细节。 您应该显式导入 builtins 模块(或 Python 2 中的 __builtin__)。
    猜你喜欢
    • 2011-04-04
    • 2010-10-19
    • 2012-08-26
    • 2016-03-20
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-14
    相关资源
    最近更新 更多