在执行测试之前,例如
if something in the_object:
...
我想测试一下在the_object
上使用in
关键字是否安全。我相信,如果the_object
有几种方法中的一种,比如__contains__
和__iter__
,那么in
将在这种用法中起作用。你知道吗
有没有类似于下面的测试可以使用,但是它检查与in
的兼容性,而不是包含__iter__
?你知道吗
import collections
if isinstance(the_object, collections.Iterable):
if something in the_object:
...
或者我应该
try:
if something in the_object:
...
except TypeError:
# move on
注意:我把这个答案作为一个CW帖子,只是为了将这个问题标记为已回答。真正的功劳在于胡安帕.阿里维拉加还有尼克A,在评论里。
请求原谅比得到允许更容易
in
首先查找包含__contains__()
的对象,然后查找__iter__()
,最后查找__getitem__()
。虽然您可以检查它们中的每一个,但执行try...except
操作将允许in
为您执行操作,否则会出错下面是胡安帕.阿里维拉加链接到:
6.10.2。成员资格测试操作
操作符}计算为
in
和not in
测试成员资格。^如果x是s的成员,{True
,否则False
。x not in s
返回x in s
的否定。所有内置的序列和集合类型都支持dictionary,dictionary用于测试dictionary是否具有给定的键。对于容器类型,如list、tuple、set、frozenset、dict或收藏.deque,表达式x in y
等价于any(x is e or x == e for e in y)
。你知道吗对于字符串和字节类型,
x in y
是True
当且仅当x是y的子串。等效测试是y.find(x) != -1
。空字符串总是被认为是任何其他字符串的子字符串,因此"" in "abc"
将返回True
。你知道吗对于定义
__contains__()
方法的用户定义类,如果y.__contains__(x)
返回真值,则x in y
返回True
,否则False
。你知道吗对于不定义
__contains__()
但定义__iter__()
的用户定义类,如果在y
上迭代时生成带有x == z
的值z
,则x in y
为True
。如果在迭代过程中引发异常,就好像in
引发了该异常。你知道吗最后,尝试旧式迭代协议:如果一个类定义
__getitem__()
,x in y
是True
当且仅当存在一个非负整数索引i,使得x == y[i]
,并且所有较低的整数索引都不会引发索引器异常。(如果引发任何其他异常,就好像in
引发了该异常)。你知道吗运算符
not in
被定义为具有in
的反真值。你知道吗相关问题 更多 >
编程相关推荐