在python中,测试变量是否包含列表或元组的最佳方法是什么?(即。一组)
isinstance()是否如这里所建议的那样邪恶?http://www.canonical.org/~kragen/isinstance/
更新:我想要区分列表和字符串的最常见原因是,当我有一些无限深嵌套的字符串列表的列表的列表的树/数据结构时,我正在用递归算法探索,我需要知道什么时候我已经碰到了“叶”节点。
在python中,测试变量是否包含列表或元组的最佳方法是什么?(即。一组)
isinstance()是否如这里所建议的那样邪恶?http://www.canonical.org/~kragen/isinstance/
更新:我想要区分列表和字符串的最常见原因是,当我有一些无限深嵌套的字符串列表的列表的列表的树/数据结构时,我正在用递归算法探索,我需要知道什么时候我已经碰到了“叶”节点。
当前回答
那么:hasattr(a, "__iter__")呢?
它告诉返回的对象是否可以作为生成器迭代。默认情况下,元组和列表可以,但字符串类型不行。
其他回答
if type(x) is list:
print 'a list'
elif type(x) is tuple:
print 'a tuple'
else:
print 'neither a tuple or a list'
如果你只需要知道你是否可以对变量使用foo[123]符号,你可以用hasattr(foo, '__getitem__')检查是否存在__getitem__属性(这是python在通过索引访问时调用的属性)。
将参数记录为一个序列,并将其作为一个序列使用。不要检查类型。
不是最优雅的,但我做到了(对于Python 3):
if hasattr(instance, '__iter__') and not isinstance(instance, (str, bytes)):
...
这允许其他可迭代对象(如Django queryset),但不包括字符串和字节串。我通常在接受单个对象ID或对象ID列表的函数中使用这种方法。有时候对象id可以是字符串我不想一个字符一个字符地遍历这些。:)
如果你真的想把任何东西都当作函数参数来处理,测试就会更复杂。
type(a) != type('') and hasattr(a, "__iter__")
不过,通常只要说明函数需要可迭代对象,然后只检查type(a) != type(")就足够了。
也有可能发生,对于一个字符串,你有一个简单的处理路径,或者你会很好地做一个分割等等,所以你不想对字符串大喊大叫,如果有人给你发送了一些奇怪的东西,让他有一个异常。