在python中,测试变量是否包含列表或元组的最佳方法是什么?(即。一组)

isinstance()是否如这里所建议的那样邪恶?http://www.canonical.org/~kragen/isinstance/

更新:我想要区分列表和字符串的最常见原因是,当我有一些无限深嵌套的字符串列表的列表的列表的树/数据结构时,我正在用递归算法探索,我需要知道什么时候我已经碰到了“叶”节点。


当前回答

另一种方法是将isinstance与typing一起使用。

from typing import List, Tuple
>> isinstance([1,2], Tuple)
False
>> isinstance([1,2], List)
True

其他回答

不是最优雅的,但我做到了(对于Python 3):

if hasattr(instance, '__iter__') and not isinstance(instance, (str, bytes)):
    ...

这允许其他可迭代对象(如Django queryset),但不包括字符串和字节串。我通常在接受单个对象ID或对象ID列表的函数中使用这种方法。有时候对象id可以是字符串我不想一个字符一个字符地遍历这些。:)

那么:hasattr(a, "__iter__")呢?

它告诉返回的对象是否可以作为生成器迭代。默认情况下,元组和列表可以,但字符串类型不行。

在Python 2.8中,type(list) is list返回false 我建议用这种可怕的方式进行比较:

if type(a) == type([]) :
  print "variable a is a list"

(至少在我的系统上,在Mac OS X Yosemite上使用anaconda)

>>> l = []
>>> l.__class__.__name__ in ('list', 'tuple')
True

另一种方法是将isinstance与typing一起使用。

from typing import List, Tuple
>> isinstance([1,2], Tuple)
False
>> isinstance([1,2], List)
True