测试变量是列表还是元组

新手上路,请多包涵

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

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

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

原文由 interstar 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 689
2 个回答

继续使用 isinstance 如果你需要它。这有点邪恶,因为它排除了自定义序列、迭代器和其他您可能实际需要的东西。但是,有时如果有人(例如)传递一个字符串,您需要采取不同的行为。我的偏好是明确检查 strunicode 像这样:

 import types
isinstance(var, types.StringTypes)

注意不要将 types.StringType 误认为 --- types.StringTypes 。后者包含 strunicode 对象。

types 模块被许多人认为已经过时,有利于直接检查对象的类型,所以如果你不想使用上面的,你也可以明确地检查 strunicode ,像这样:

 isinstance(var, (str, unicode)):

编辑:

更好的是:

 isinstance(var, basestring)

结束编辑

在其中任何一个之后,您都可以回到正常序列的行为,让非序列引发适当的异常。

看到关于类型检查的“邪恶”的事情不是你可能想要对某种类型的对象采取不同的行为,而是你人为地限制你的函数使用意外的对象类型做正确的事情,否则这些对象类型会做正确的事情。如果您有一个未经过类型检查的最终回退,则删除此限制。应该注意的是,过多的类型检查是一种代码异味,表明您可能想要进行一些重构,但这并不一定意味着您应该从一开始就避免它。

原文由 jcdyer 发布,翻译遵循 CC BY-SA 3.0 许可协议

if type(x) is list:
    print 'a list'
elif type(x) is tuple:
    print 'a tuple'
else:
    print 'neither a tuple or a list'

原文由 wall-e 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题