代码之家  ›  专栏  ›  技术社区  ›  David Locke

是否存在len(someObj)不调用someObj的函数的情况?

  •  6
  • David Locke  · 技术社区  · 16 年前

    有什么情况吗 len(someObj) 不叫某人的 __len__ 作用

    最近,为了(成功地)加速一些代码,我将前者替换为后者。我想确定在什么地方没有边缘案例 不一样 someObj.__len__()

    4 回复  |  直到 5 年前
        1
  •  13
  •   Benjamin Peterson    16 年前

    如果 __len__ 返回长度超过 sys.maxsize , len() 将引发异常。打电话不是这样的 __莱恩__ __莱恩__ 除非通过,否则不会被抓到 len()

        2
  •  11
  •   Crescent Fresh    16 年前

    你看到了什么样的加速?我无法想象这是显而易见的,是吗?

    http://mail.python.org/pipermail/python-list/2002-May/147079.html

    不同之处在于,使用len()是 出于几个原因,我更喜欢它。

    首先,不建议去 呼叫 __methods__

    len() 可用于任何类型的 序列对象( lists tuples 和 全部)。 __len__ 将仅在具有 __莱恩__ 方法

    len() 将返回一个更合适的 无长度对象上的异常。

        3
  •  2
  •   Eli Courtwright    16 年前

    __len__(self):
    

    调用以实现内置函数len()。应返回对象的长度,一个整数>=0另外,一个没有定义 __nonzero__() __len__() 方法返回零在布尔上下文中被视为false。

        4
  •  0
  •   wjandrea senderle    5 年前

    有些情况下 len(someObj) someObj.__len__() 自从 len() __len__() 的返回值。以下是Python 3.6.9中可能出现的错误:

    • 太小,即小于0

      ValueError: __len__() should return >= 0
      
    • 太大,即大于 sys.maxsize (根据 docs )

      OverflowError: cannot fit 'int' into an index-sized integer
      
    • 无效的类型,例如 float

      TypeError: 'float' object cannot be interpreted as an integer
      
    • 失踪。 len(object)

      TypeError: object of type 'type' has no len()
      

      我提到这一点是因为 object.__len__() 引发了另一个例外, AttributeError .

    同样值得注意的是 range(sys.maxsize+1) 是有效的,但其 引发了一个异常:

    OverflowError: Python int too large to convert to C ssize_t
    
        5
  •  -4
  •   brettkelly    16 年前

    根据MarkPilgrim的说法,看起来不是。 len(someObj) someObj.__len__() ;