2016-03-01 7 views
5

मैं आसानी से उस ऑब्जेक्ट को कैसे बना सकता हूं जिसे मेरे आरपीसी कोड में किनारे के मामलों का परीक्षण करने के लिए नहीं चुना जा सकता है?ऑब्जेक्ट बनाएं जिसे मसालेदार नहीं किया जा सकता

यह होने की जरूरत है:

  1. सरल
  2. विश्वसनीय
  3. क्रॉस मंच

संपादित करें (अजगर या अचार के भविष्य के संस्करणों में तोड़ने के लिए की उम्मीद नहीं): इच्छित उपयोग दिखता है इस तरह कुछ:

class TestRPCServer: 
    def foo(self): 
     return MagicalUnpicklableObject() 

def test(): 
    with run_rpc_server_and_connect_to_it() as proxy: 
     with nose.assert_raises(pickle.PickleError): 
      proxy.foo() 
+0

आप क्या बना रहे हैं: (और अन्य उन्नत serializers) किसी भी प्रकार कि सीधे एक अजगर FrameType से जुड़ा हुआ है एक जनरेटर की तरह, पर असफल हो जायेगी? क्या हम वस्तु में नमूना कोड का सवाल उठा सकते हैं? – GLaDOS

उत्तर

6

यदि आपको केवल एक ऑब्जेक्ट चाहिए जो परीक्षण के पिल्लों के लिए इसे चुनने पर एक अपवाद फेंक देगा, तो आप __getstate__ method को उड़ा सकते हैं।

>>> class C: 
...  def __getstate__(self): 
...   raise Exception 
... 
>>> pickle.dumps(C()) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 1374, in dumps 
    Pickler(file, protocol).dump(obj) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 224, in dump 
    self.save(obj) 
    File "/System/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 "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 723, in save_inst 
    stuff = getstate() 
    File "<stdin>", line 3, in __getstate__ 
Exception 

शायद उससे भी आसान हो जाता है!


आप एक कम कृत्रिम परिदृश्य चाहते हैं, वस्तुओं, आदि है कि फ़ाइल हैंडल, या सॉकेट, या धागे की तरह ओएस संसाधनों का उपयोग के बारे में सोचना

>>> with open('spam.txt', 'w') as f: 
...  pickle.dumps(f) 
... 
Traceback (most recent call last): 
    File "<stdin>", line 2, in <module> 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 1374, in dumps 
    Pickler(file, protocol).dump(obj) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 224, in dump 
    self.save(obj) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 306, in save 
    rv = reduce(self.proto) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/copy_reg.py", line 70, in _reduce_ex 
    raise TypeError, "can't pickle %s objects" % base.__name__ 
TypeError: can't pickle file objects 
+0

पहला तरीका बिल्कुल वही लगता है जो मुझे चाहिए, धन्यवाद। मैं फंस गया क्योंकि मैंने इसे पिकलेरर फेंकने की कोशिश की, जो वास्तव में अनावश्यक है। एक कस्टम अपवाद वर्ग बनाना और फेंकना पर्याप्त है। – cube

2

आप वस्तुओं की एक स्पष्ट सूची चाहते हैं कि pickle का उपयोग करके, dill जैसे अधिक उन्नत धारावाहिकों, इस फ़ाइल में मानक लाइब्रेरी ऑब्जेक्ट्स के लिए कुछ व्यापक सूची शामिल है, जो मसालेदार बनाम वस्तुओं को मसालेदार नहीं किया जा सकता है। यह प्रत्येक ऑब्जेक्ट (आमतौर पर, एक-लाइनर) बनाने के लिए एक आसान तरीका प्रदान करता है, और यदि लागू हो, तो पाइथन के विभिन्न संस्करणों के लिए वेरिएंट दिखाता है।

https://github.com/uqfoundation/dill/blob/cccbea9b715e16b742288e1e5a21a687a4d4081b/dill/_objects.py#L255

उदाहरण के लिए, pickle, निम्नलिखित वस्तु पर विफल हो जाएगा, जबकि dill जैसे उन्नत serializers नहीं करेंगे:

>>> import dill 
>>> dill.dumps(Ellipsis) 
b'\x80\x03cdill.dill\n_eval_repr\nq\x00X\x08\x00\x00\x00Ellipsisq\x01\x85q\x02Rq\x03.' 

उन्नत serializers भी फ़ाइल की वस्तुओं और तरह पर काम कर सकते Btw:

>>> dill.dumps(open('foo.pkl', 'w')) 
b'\x80\x03cdill.dill\n_create_filehandle\nq\x00(X\x07\x00\x00\x00foo.pklq\x01X\x01\x00\x00\x00wq\x02K\x00\x89cdill.dill\n_get_attr\nq\x03cdill.dill\n_import_module\nq\x04X\x02\x00\x00\x00ioq\x05\x85q\x06Rq\x07X\x04\x00\x00\x00openq\x08\x86q\tRq\n\x89K\x00X\x00\x00\x00\x00q\x0btq\x0cRq\r.' 

हालांकि, pickle और dill

>>> dill.dumps((i for i in [])) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Users/mmckerns/lib/python3.4/site-packages/dill-0.2.6.dev0-py3.4.egg/dill/dill.py", line 243, in dumps 
    dump(obj, file, protocol, byref, fmode, recurse)#, strictio) 
    File "/Users/mmckerns/lib/python3.4/site-packages/dill-0.2.6.dev0-py3.4.egg/dill/dill.py", line 236, in dump 
    pik.dump(obj) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/pickle.py", line 412, in dump 
    self.save(obj) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/pickle.py", line 499, in save 
    rv = reduce(self.proto) 
TypeError: can't pickle generator objects 
संबंधित मुद्दे

 संबंधित मुद्दे