【发布时间】:2015-08-02 11:00:14
【问题描述】:
找出in 运算符是否可以在python 中使用的最简单(也是最优雅)的方法是什么?
如果我打开一个 python shell 并输入:
"" in 2
打印出来:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: argument of type 'int' is not iterable
根据python-docs,一个可迭代对象是:
容器。iter()
返回一个迭代器对象。该对象需要支持下面描述的迭代器协议。如果一个容器支持不同的 迭代类型,可以提供额外的方法来专门 为这些迭代类型请求迭代器。 (一个对象的例子 支持多种形式的迭代将是一个树结构,它 支持广度优先和深度优先遍历。)这种方法 对应于 Python 的类型结构的 tp_iter 槽 Python/C API 中的对象。
所以
hasattr([], "__iter__") and hasattr({}, "__iter__")
按预期返回true,但是
hasattr("test_string", "__iter__")
返回假。但我可以使用
"test" in "test_string"
没有任何问题。
优雅我指的是不使用 try-except 解决方案
【问题讨论】:
-
旁白:如果您认为 try-except 不优雅,您会发现 Python 非常令人沮丧。 (您的代码也可能到处都有竞争条件,但这是另一个问题。)
-
动态类型语言的一个问题确实是编译器无法在编译时检查这个(当然你买东西作为回报)。
-
你也可以检查
__contains__ -
hasattr()只是getattr()在 try/except 后面。试图避免异常真的不值得。
标签: python iterator containers