覆盖 __init__.py 中的 len - python
Overriding len in __init__.py - python
我想通过以下方式为我的包的 __init__.py
文件中的 len 分配另一个函数:
llen = len
len = lambda x: llen(x) - 1
它工作正常,但只在 __init__.py
文件中。我怎样才能让它影响我包中的其他模块?
这可能不是您正在寻找的答案,但如果我是您,我不会这样做(而且我敢肯定,无论如何您都做不到)。
您不应该这样做的原因是 python 在其对象内部使用 len
来执行某些操作。
另一个原因是纯粹的破坏逻辑。上面定义的 len
函数将 return 一个 负长度 用于空列表或空的东西。这对我来说似乎很糟糕。
您可以 做的是仅在某些 class 上覆盖长度方法(这对您来说可能很有意义)。为此,您可以使用运算符重载,只需覆盖 class:
中的方法 __len__
class MyList(object):
def __len__(self,):
# Do your thing
您可能还想查看 meta classes,关于这个主题有一个很好的 stack overflow 问题。
当您尝试加载未定义为模块级全局或函数局部的名称时,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
我想通过以下方式为我的包的 __init__.py
文件中的 len 分配另一个函数:
llen = len
len = lambda x: llen(x) - 1
它工作正常,但只在 __init__.py
文件中。我怎样才能让它影响我包中的其他模块?
这可能不是您正在寻找的答案,但如果我是您,我不会这样做(而且我敢肯定,无论如何您都做不到)。
您不应该这样做的原因是 python 在其对象内部使用 len
来执行某些操作。
另一个原因是纯粹的破坏逻辑。上面定义的 len
函数将 return 一个 负长度 用于空列表或空的东西。这对我来说似乎很糟糕。
您可以 做的是仅在某些 class 上覆盖长度方法(这对您来说可能很有意义)。为此,您可以使用运算符重载,只需覆盖 class:
中的方法__len__
class MyList(object):
def __len__(self,):
# Do your thing
您可能还想查看 meta classes,关于这个主题有一个很好的 stack overflow 问题。
当您尝试加载未定义为模块级全局或函数局部的名称时,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