1
mengzhuo 2013-10-10 16:45:34 +08:00
“所以我希望可以通过修改c的next函数让i变成storage类型(一种可以通过i.name代替i['name']的类)“
改写__getitem__成__getattr__,但是这不符合”属性必须明确“的原则。_所以继续用着吧_。 可迭代是添加__next__ __iter__两个函数 |
2
sdjl OP for i in c:
print i 这里写错了, 应该是 for i in results |
3
sdjl OP |
4
sdjl OP 注明,代码中id(it)和id(c)是相等的, print type(it)和print type(c)均显示:
<class 'pymongo.collection.Collection'> |
5
keakon 2013-10-10 16:52:06 +08:00
1. 返回的就是 Cursor 类的对象。
2. 定义 __iter__ 和 next 方法。 3. next 是个方法,你把这个方法替换成了一个对象,然后去调用这个对象,自然会失败。 不建议你把 Cursor.next 方法给替换掉,你在使用时自己转换下又不会怀孕: for i in c: i = storage(**i) |
6
sdjl OP 写错了, print type(it) 是 <class 'pymongo.cursor.Cursor'>
|
7
sdjl OP |
9
sdjl OP 如果我直接调用 results.next() 那么结果是正确的,能得到storage类型
所以我怀疑是否没用到pymongo.cursor.Cursor的next函数,尝试删除此next函数,for语句抛错,表明应该确实使用了此next函数 但是我在it(is c)上“重新定义”next函数,或删除next函数,均没有任何效果 |
10
sdjl OP 也就是说以下代码不会抛出异常,可以正常运行,很奇怪
|
11
binux 2013-10-10 17:20:28 +08:00
dict是内置对象
|
12
thedevil5032 2013-10-10 17:23:24 +08:00
|
13
piglei 2013-10-10 17:35:56 +08:00 1
刚刚我稍微读了一下pymongo的源码,pymongo的Cursor对象是靠实现__getitem__方法来实现可迭代对象的,例如:
# -*- coding: utf-8 -*- class IterTester(object): def __getitem__(self, index): if index == 10: raise StopIteration() return index if __name__ == '__main__': for x in IterTester(): print x 具体的你可以再仔细看看源码。 另外如 @keakon 所说,不建议你修改Cursor的方法来实现类似功能,麻烦且不实用。 |
15
hepochen 2013-10-10 17:46:37 +08:00
patch不是这种写法, patch之后,确保patch的代码,运行于所patch的类被实例化之前。
from pymongo.collection import Collection old_func = Collection.find def find(self, *args, **kwargs): old_func(self, *args, **kwargs) your_code = 'here' Collection.find = find |
16
hepochen 2013-10-10 17:59:13 +08:00
@sdjl __getitem__ 和 next 两个函数在pymongo中是应对不通场景的调用,所以都有,只去掉其中一个,呃,这仍然是可遍历的。
还是建议自己打patch,调用比较方便,也可以不用管后面的实现。之前有个版本,作者对__getitem__函数的处理就不一样,测试没有跑全就发布了,然后就bug了。 |