这是我通常所做的,以确定输入是一个列表/元组-而不是一个str。因为很多次我偶然发现错误,其中一个函数错误地传递了一个str对象,而目标函数在lst中执行x,假设lst实际上是一个列表或元组。
assert isinstance(lst, (list, tuple))
我的问题是:有没有更好的方法来实现这个目标?
这是我通常所做的,以确定输入是一个列表/元组-而不是一个str。因为很多次我偶然发现错误,其中一个函数错误地传递了一个str对象,而目标函数在lst中执行x,假设lst实际上是一个列表或元组。
assert isinstance(lst, (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的子类。
我在测试用例中这样做。
def assertIsIterable(self, item):
#add types here you don't want to mistake as iterables
if isinstance(item, basestring):
raise AssertionError("type %s is not iterable" % type(item))
#Fake an iteration.
try:
for x in item:
break;
except TypeError:
raise AssertionError("type %s is not iterable" % type(item))
没有在发电机上进行测试,我认为如果通过发电机,你会在下一次“屈服”时留下,这可能会把下游的事情搞砸。不过,这是一个unittest
带有PHP风格的Python:
def is_array(var):
return isinstance(var, (list, tuple))
就这么做
if type(lst) in (list, tuple):
# Do stuff
我倾向于这样做(如果我真的,真的必须这么做的话):
for i in some_var:
if type(i) == type(list()):
#do something with a list
elif type(i) == type(tuple()):
#do something with a tuple
elif type(i) == type(str()):
#here's your string