在 python 中,测试变量是否包含列表或元组的最佳方法是什么? (即一个集合)
isinstance()
是否像这里建议的那样邪恶? http://www.canonical.org/~kragen/isinstance/
更新:我想将列表与字符串区分开来的最常见原因是,当我有一些无限深的嵌套树/字符串列表列表的数据结构等时,我正在使用递归算法进行探索,我需要知道我什么时候碰到了“叶子”节点。
原文由 interstar 发布,翻译遵循 CC BY-SA 4.0 许可协议
在 python 中,测试变量是否包含列表或元组的最佳方法是什么? (即一个集合)
isinstance()
是否像这里建议的那样邪恶? http://www.canonical.org/~kragen/isinstance/
更新:我想将列表与字符串区分开来的最常见原因是,当我有一些无限深的嵌套树/字符串列表列表的数据结构等时,我正在使用递归算法进行探索,我需要知道我什么时候碰到了“叶子”节点。
原文由 interstar 发布,翻译遵循 CC BY-SA 4.0 许可协议
4 回答4.4k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
1 回答4.4k 阅读✓ 已解决
1 回答3.8k 阅读✓ 已解决
1 回答2.8k 阅读✓ 已解决
2 回答2k 阅读✓ 已解决
继续使用
isinstance
如果你需要它。这有点邪恶,因为它排除了自定义序列、迭代器和其他您可能实际需要的东西。但是,有时如果有人(例如)传递一个字符串,您需要采取不同的行为。我的偏好是明确检查str
或unicode
像这样:注意不要将
types.StringType
误认为 ---types.StringTypes
。后者包含str
和unicode
对象。types
模块被许多人认为已经过时,有利于直接检查对象的类型,所以如果你不想使用上面的,你也可以明确地检查str
和unicode
,像这样:编辑:
更好的是:
结束编辑
在其中任何一个之后,您都可以回到正常序列的行为,让非序列引发适当的异常。
看到关于类型检查的“邪恶”的事情不是你可能想要对某种类型的对象采取不同的行为,而是你人为地限制你的函数使用意外的对象类型做正确的事情,否则这些对象类型会做正确的事情。如果您有一个未经过类型检查的最终回退,则删除此限制。应该注意的是,过多的类型检查是一种代码异味,表明您可能想要进行一些重构,但这并不一定意味着您应该从一开始就避免它。