2014-10-08 45 views
0

我在探索Dill的detect方法,並且正在尋找一個不好的項目的簡單示例 - Dill不可取消。蒔蘿模塊中BadItem的好例子

我首先想到的一個過程,並試圖:如果蘿使用尋求detectbaditems因爲你不能在管道上尋求

>>> proc = os.popen('ls -l') 
>>> proc 
<open file 'ls -l', mode 'r' at 0x10071d780> 
>>> dill.detect.baditems(proc) 
[] 
>>> dill.dumps(proc) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Users/mikekilmer/Envs/env1/lib/python2.7/site-packages/dill/dill.py", line 143, in dumps 
    dump(obj, file, protocol, byref) 
    File "/Users/mikekilmer/Envs/env1/lib/python2.7/site-packages/dill/dill.py", line 136, in dump 
    pik.dump(obj) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 224, in dump 
    self.save(obj) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 
    File "/Users/mikekilmer/Envs/env1/lib/python2.7/site-packages/dill/dill.py", line 557, in save_file 
    position = obj.tell() 
IOError: [Errno 29] Illegal seek 

我的猜測將預期。

然後我想,肯定globals()有東西可以提供。這再次提供相同IOerror直到proc被刪除,然後產生:

>>> dill.detect.baditems(globals) 
[<module 'pickle' from '/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.pyc'>, <module 'os' from '/Users/mikekilmer/Envs/env1/lib/python2.7/os.pyc'>, <__main__.Child object at 0x100776090>] 

什麼是項目的一個很好的簡單的例子,dill.detect會返回一個壞項目?

回答

1

dill.detect.baditems應該檢查對象內的「不良項目​​」內部(即,檢查不醃製的對象內部的內容)。也許,在頂層它應該檢查對象本身是否受到醃製......目前它不是,這可能會引起誤解。

在這裏,我將演示一個不可抽出的物品,baditems表示裏面沒有任何不可取的東西,這是真的。然後我會展示baditems如何在globals中找到不可拆項目,並正確識別不能醃製的內容。

>>> x = iter([1,2,3,4,5]) 
>>> x 
<listiterator object at 0x10d743510> 
>>> import dill 
>>> # everything inside a listiterator is serializable 
>>> dill.detect.baditems(x) 
[] 
>>> # however, not everything in globals is serializable 
>>> dill.detect.baditems(globals()) 
[<module '__builtin__' (built-in)>, <listiterator object at 0x10d743510>] 

希望這似乎不太反直覺。