如何检查len是否有效

Dea*_*Eli 15 python

我有一个功能

def foo(bar):
    #do some things
    len(bar)
Run Code Online (Sandbox Code Playgroud)

如果我打电话

foo(42)
Run Code Online (Sandbox Code Playgroud)

它抛出一个例外

TypeError:'int'类型的对象没有len()

如何检查输入的值是否可以与len()一起使用?

Nat*_*ath 20

你可以做:

if hasattr(bar, '__len__'):
    pass
Run Code Online (Sandbox Code Playgroud)

或者,您可以捕获TypeError.

  • 难道这不需要在dir(bar)中`__len__`吗?无论哪种方式,如果你采用这种方法,使用`hasattr`会更好 (2认同)
  • 即使对象具有 `__len__` 属性,也不意味着它是有效的(或者 OP 应该定义什么是 **valid**)。例如,一个类可以定义一个 `__len__` 函数,它返回一个 `str`,它会通过 `hasattr` 测试,但是当你在它上面调用 `len()` 时仍然抛出 `TypeError` 异常。这正是**异常处理**的目的,惩罚他们给我脏输入。 (2认同)

Mar*_*ers 9

您可以测试对象是否Sized:

import collections

if isinstance(bar, collections.Sized):
Run Code Online (Sandbox Code Playgroud)

isinstance()如果所有的抽象方法的测试是真实的Sized实现; 在这种情况下,这只是__len__.

就个人而言,我只是抓住异常:

try:
    foo(42)
except TypeError:
    pass  # oops, no length
Run Code Online (Sandbox Code Playgroud)


ssh*_*124 5

您可以使用tryexcept获得最佳效果:

def foo(bar):
    #do some things
    try:
        print(len(bar))
    except TypeError:
        print('Input not compatible with len()')
Run Code Online (Sandbox Code Playgroud)


ale*_*cxe 5

由于在后台调用魔术方法,您可以检查对象是否具有在以下帮助下定义的方法:len() __len__()__len__hasattr()

>>> def has_len(obj):
...     return hasattr(obj, '__len__')
... 
>>> has_len([1,2,3])
True
>>> has_len('test')
True
>>> has_len(1)
False
Run Code Online (Sandbox Code Playgroud)