【发布时间】:2013-11-13 01:42:21
【问题描述】:
为了更好地解释,考虑这个简单的类型检查器函数:
from collections import Iterable
def typecheck(obj):
return not isinstance(obj, str) and isinstance(obj, Iterable)
如果obj 是str 以外的可迭代类型,则返回True。但是,如果obj 是str 或不可迭代类型,则返回False。
有什么方法可以更有效地执行类型检查?我的意思是,检查obj 的类型以查看它是否不是str 然后再次检查它以查看它是否可迭代似乎有点多余。
我想过列出除 str 之外的所有其他可迭代类型,如下所示:
return isinstance(obj, (list, tuple, dict,...))
但问题是这种方法会遗漏任何其他未明确列出的可迭代类型。
那么...有什么更好的方法还是我在函数中给出的方法最有效?
【问题讨论】:
-
这不是低效的。您可能有更重要的事情要担心。
-
@thefourtheye - 因为有时您需要检查某些内容是否可迭代但不是字符串。一个示例可以是展平嵌套列表的函数。您不希望其中的字符串也变平。
-
@iCodez:但是你想让 dicts 变平吗?还是文件?在这种特定情况下,专门检查列表似乎更合理。也就是说,在某些合法用例中,您希望接受一个字符串或一个字符串序列,并且您希望区分这两者。
-
如果排除str,通常也应该排除unicode和buffer
-
@aIKid - 是的,我也不太喜欢
isinstance(obj, (list, tuple, dict,...))解决方案。我只是好奇是否有任何方法可以做到这一点而无需两次调用isinstance。但现在我开始认为这是实际上是最好的方法。
标签: python python-3.x typechecking