在Python2.7中,如何检查是否可以使用'In'关键字查看对象是否包含项?

2024-04-26 12:03:12 发布

您现在位置:Python中文网/ 问答频道 /正文

在执行测试之前,例如

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 

Tags: the方法inimport用法ifobject关键字
1条回答
网友
1楼 · 发布于 2024-04-26 12:03:12

注意:我把这个答案作为一个CW帖子,只是为了将这个问题标记为已回答。真正的功劳在于胡安帕.阿里维拉加还有尼克A,在评论里。

请求原谅比得到允许更容易

in首先查找包含__contains__()的对象,然后查找__iter__(),最后查找__getitem__()。虽然您可以检查它们中的每一个,但执行try...except操作将允许in为您执行操作,否则会出错

下面是胡安帕.阿里维拉加链接到:

6.10.2。成员资格测试操作

操作符innot in测试成员资格。^如果xs的成员,{}计算为True,否则Falsex 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 yTrue当且仅当xy的子串。等效测试是y.find(x) != -1。空字符串总是被认为是任何其他字符串的子字符串,因此"" in "abc"将返回True。你知道吗

对于定义__contains__()方法的用户定义类,如果y.__contains__(x)返回真值,则x in y返回True,否则False。你知道吗

对于不定义__contains__()但定义__iter__()的用户定义类,如果在y上迭代时生成带有x == z的值z,则x in yTrue。如果在迭代过程中引发异常,就好像in引发了该异常。你知道吗

最后,尝试旧式迭代协议:如果一个类定义__getitem__()x in yTrue当且仅当存在一个非负整数索引i,使得x == y[i],并且所有较低的整数索引都不会引发索引器异常。(如果引发任何其他异常,就好像in引发了该异常)。你知道吗

运算符not in被定义为具有in的反真值。你知道吗

相关问题 更多 >