Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何检查len是否有效_Python - Fatal编程技术网

Python 如何检查len是否有效

Python 如何检查len是否有效,python,Python,我有一个函数 def foo(bar): #do some things len(bar) 如果我打电话 foo(42) 它抛出了一个异常 TypeError:类型为“int”的对象没有len() 如何检查输入的值是否可以与len()一起使用?您可以使用try和进行检查,除了之外,以获得最佳结果: def foo(bar): #do some things try: print(len(bar)) except TypeError:

我有一个函数

def foo(bar):
    #do some things
    len(bar)
如果我打电话

foo(42)
它抛出了一个异常

TypeError:类型为“int”的对象没有len()


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

您可以使用
try
进行检查,除了
之外,以获得最佳结果:

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

您可以测试对象是否为:

如果实现了
size
的所有抽象方法,则
isinstance()
测试为真;在这种情况下,这只是
\uuu len\uuu

就我个人而言,我只想抓住例外:

try:
    foo(42)
except TypeError:
    pass  # oops, no length
你可以做:

if hasattr(bar, '__len__'):
    pass
或者,您可以捕获TypeError。

因为在引擎盖下,您可以检查对象是否有通过以下帮助定义的
\uuu len\uuu
方法:


这不需要是dir(bar)
中的
吗?无论采用哪种方法,使用
hasattr
都会更好。即使对象具有
\uu len\uuu
属性,也不意味着它是有效的(或者OP应该定义什么是有效的)。例如,一个类可以定义一个
函数,该函数返回一个
str
,它将通过
hasattr
测试,但在调用
len()
时仍然抛出
TypeError
异常。这正是异常处理的设计目的,惩罚他们给我肮脏的输入。应该从
collections.abc
导入
Sized
collections.Sized
和其他自Python 3.3以来就被弃用并计划在3.9中停止工作)作为一般规则,这可以说是最具Python风格的,鸭子打字法。它不适用于某些用例,例如列表或dict理解。
if hasattr(bar, '__len__'):
    pass
>>> def has_len(obj):
...     return hasattr(obj, '__len__')
... 
>>> has_len([1,2,3])
True
>>> has_len('test')
True
>>> has_len(1)
False