在执行
之类的测试之前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
答案 0 :(得分:1)
注意:我已将此答案作为CW帖子,只是为了将此问题标记为已回答。真实的功劳归功于juanpa.arrivillaga和Nick A.,在评论中。
in
首先查看对象包含__contains__()
,然后查找__iter__()
,然后查找__getitem__()
。虽然您可以检查每一个,但执行try...except
会允许in
为您执行此操作,或者如果不能执行则会执行错误。
以下是juanpa.arrivillaga链接到的部分:
运营商in
和not in
测试会员资格。如果 x 是 s 的成员,则x in s
评估为True
,否则为False
。 x 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 y
是True
当且仅当 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
如果某些值为z
且x == z
为y
迭代in
时生成。如果在迭代期间引发异常,就好像__getitem__()
引发了异常。
最后,尝试了旧式迭代协议:如果一个类定义x in y
,True
是x == 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');
});
的反向真值。