在Python 2.7中,我应该如何检查是否可以使用`in`关键字来查看对象是否包含项?

时间:2017-12-14 23:31:22

标签: python

在执行

之类的测试之前
if something in the_object:
    ...

我想测试在in上使用the_object关键字是否安全。如果in具有the_object__contains__等多种方法之一,我相信__iter__将适用于此用途。

是否有与我可以使用的类似的测试,但检查与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 

1 个答案:

答案 0 :(得分:1)

注意:我已将此答案作为CW帖子,只是为了将此问题标记为已回答。真实的功劳归功于juanpa.arrivillaga和Nick A.,在评论中。

请求宽恕比允许更容易

in首先查看对象包含__contains__(),然后查找__iter__(),然后查找__getitem__()。虽然您可以检查每一个,但执行try...except会允许in为您执行此操作,或者如果不能执行则会执行错误。

以下是juanpa.arrivillaga链接到的部分:

6.10.2。成员资格测试操作

运营商innot in测试会员资格。如果 x s 的成员,则x in s评估为True,否则为Falsex not in s返回x in s的否定。所有内置序列和集合类型都支持这个以及字典,在测试中字典是否具有给定键。对于容器类型,例如list,tuple,set,frozenset,dict或collections.deque,表达式x in y等同于any(x is e or x == e for e in y)

对于字符串和字节类型,x in yTrue当且仅当 x y 的子字符串时。等效测试是y.find(x) != -1。空字符串始终被视为任何其他字符串的子字符串,因此"" in "abc"将返回True

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

对于未定义__contains__()但定义__iter__()但定义x in y的用户定义类,True如果某些值为zx == zy迭代in时生成。如果在迭代期间引发异常,就好像__getitem__()引发了异常。

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

运算符in被定义为具有var express = require('express'); var router = express.Router(); var mongoose = require('mongoose'); var assert = require('assert'); var url = 'mongodb://felipe:teste@ds033125.mlab.com:33125/form'; mongoose.connect(url); /* GET home page. */ router.get('/', function(req, res, next) { res.render('index'); });的反向真值。