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