这是我通常所做的,以确定输入是一个列表/元组-而不是一个str。因为很多次我偶然发现错误,其中一个函数错误地传递了一个str对象,而目标函数在lst中执行x,假设lst实际上是一个列表或元组。
assert isinstance(lst, (list, tuple))
我的问题是:有没有更好的方法来实现这个目标?
这是我通常所做的,以确定输入是一个列表/元组-而不是一个str。因为很多次我偶然发现错误,其中一个函数错误地传递了一个str对象,而目标函数在lst中执行x,假设lst实际上是一个列表或元组。
assert isinstance(lst, (list, tuple))
我的问题是:有没有更好的方法来实现这个目标?
当前回答
带有PHP风格的Python:
def is_array(var):
return isinstance(var, (list, tuple))
其他回答
str对象没有__iter__属性
>>> hasattr('', '__iter__')
False
你可以检查一下
assert hasattr(x, '__iter__')
这也会对任何其他不可迭代对象抛出一个漂亮的AssertionError。
编辑: 正如Tim在评论中提到的,这只适用于python2。X,不是3。X
仅在python2中(不是python3):
assert not isinstance(lst, basestring)
实际上是你想要的,否则你会错过很多像列表一样的东西,但不是list或tuple的子类。
以“鸭子打字”的方式,怎么样
try:
lst = lst + []
except TypeError:
#it's not a list
or
try:
lst = lst + ()
except TypeError:
#it's not a tuple
分别。这避免了isinstance / hasattr自省的事情。
你也可以反过来检查:
try:
lst = lst + ''
except TypeError:
#it's not (base)string
所有变量实际上并不改变变量的内容,而是意味着重新赋值。我不确定在某些情况下这是否不可取。
有趣的是,如果lst是一个列表(不是元组),使用“in place”赋值+=在任何情况下都不会引发TypeError。这就是为什么作业是这样做的。也许有人能解释一下原因。
Python 3有这个:
from typing import List
def isit(value):
return isinstance(value, List)
isit([1, 2, 3]) # True
isit("test") # False
isit({"Hello": "Mars"}) # False
isit((1, 2)) # False
因此,要检查list和tuple,它将是:
from typing import List, Tuple
def isit(value):
return isinstance(value, List) or isinstance(value, Tuple)
在python中>3.6
import collections
isinstance(set(),collections.abc.Container)
True
isinstance([],collections.abc.Container)
True
isinstance({},collections.abc.Container)
True
isinstance((),collections.abc.Container)
True
isinstance(str,collections.abc.Container)
False