2010-07-30 24 views
5

किसी ऐसे प्रोजेक्ट पर काम करना जिसके लिए मैं किसी भी बिंदु पर कंटेनर ऑब्जेक्ट को चुनने में सक्षम हूं, क्योंकि हम उम्मीद करते हैं कि यह बाहरी परिस्थितियों में अक्सर असफल हो जाए और जहां से हमने छोड़ा था वहां राज्य को चुनने में सक्षम हो।लॉगजर नहीं उठा सकते हैं?

मैं अजगर प्रवेश पुस्तकालय का उपयोग कर रहा काफी बड़े पैमाने पर, और मेरे कक्षाओं के सभी तरह एक लकड़हारा सेट करके प्रारंभ:

class foo: 
    def __init__(self): 
     self.logger = logging.getLogger("package.foo") 

जब से मैं एक कंटेनर वर्ग नमकीन बनाना रहा हूँ, यह कक्षाओं की कई परतों है इसके भीतर, प्रत्येक अपने स्वयं के लॉगर उदाहरण के साथ।

अब, किसी कारण से, ये लॉगर्स अचार तोड़ रहे हैं। मैं निम्न त्रुटि है, जो दूर हो जाता है तो मैं सभी वर्गों से self.logger हटाना हो रही है:

Can't pickle 'lock' object: <thread.lock object at ... > 

तो मेरे सवाल है या नहीं, वहाँ के बिना सभी वालों से ताला वस्तुओं को हटाने के लिए किसी तरह है मेरे पूरे ऑब्जेक्ट पेड़ के माध्यम से लॉगर्स को हटाने की ज़रूरत है जिसे मुझे अनचाहे पर फिर से बनाना होगा।

उत्तर

2

काफ़ी मिलती-जुलती प्रश्न यहाँ पाया जाता है, एक जवाब है कि मेरे लिए काम किया:

How to stop attributes from being pickled in Python

संपादित How to stop attributes from being pickled in Python

+1

शायद आप अपने द्वारा उपयोग किए गए सटीक उत्तर से लिंक (या उद्धरण) से लिंक कर सकते हैं? (दो हैं) यूआरएल के लिए क्लिक कर सकते हैं किसी भी उत्तर के नीचे एक "लिंक" बटन है। – PriceChild

4

आप एक वर्ग बना सकते हैं जो लॉगर को लपेटता है और __getstate__ और __setstate__ लागू करता है।

यह http://docs.python.org/library/pickle.html से चिपकाया गया है। fh को इस तरह से संभाला जाता है जो आपको आवश्यकतानुसार समान हो सकता है। इस उत्तर के लिए प्रयोग किया जाता:

#!/usr/local/bin/python 

class TextReader: 
    """Print and number lines in a text file.""" 
    def __init__(self, file): 
     self.file = file 
     self.fh = open(file) 
     self.lineno = 0 

    def readline(self): 
     self.lineno = self.lineno + 1 
     line = self.fh.readline() 
     if not line: 
      return None 
     if line.endswith("\n"): 
      line = line[:-1] 
     return "%d: %s" % (self.lineno, line) 

    def __getstate__(self): 
     odict = self.__dict__.copy() # copy the dict since we change it 
     del odict['fh']    # remove filehandle entry 
     return odict 

    def __setstate__(self, dict): 
     fh = open(dict['file'])  # reopen file 
     count = dict['lineno']  # read from file... 
     while count:     # until line count is restored 
      fh.readline() 
      count = count - 1 
     self.__dict__.update(dict) # update attributes 
     self.fh = fh     # save the file object 
1

आप इस्तेमाल किया जा सकता था dill यहाँ है, जो अचार लॉगर्स और ताले कर सकते हैं।

>>> class foo: 
... def __init__(self): 
...  self.logger = logging.getLogger("package.foo") 
... 
>>> import dill 
>>> import logging 
>>> 
>>> f = foo() 
>>> _f = dill.dumps(f) 
>>> f_ = dill.loads(_f) 
>>> f_.logger 
<logging.Logger object at 0x110b1d250> 
4

आप एक ऐसी कक्षा भी बना सकते हैं जो आवश्यक लॉगर लौटाती हो। इस "लॉगरमिक्सिन" से प्राप्त हर वर्ग अब लॉगर का उपयोग उसी तरीके से करने में सक्षम है जिस तरह से आप इसका उपयोग कर रहे थे।

class LoggerMixin(): 
    @property 
    def logger(self): 
     component = "{}.{}".format(type(self).__module__, type(self).__name__) 
     return logging.getLogger(component) 

class Foo(LoggerMixin): 
    def __init__(self): 
     self.logger.info("initialize class") 

    def bar(self): 
     self.logger.info("execute bar") 
+0

यह एक अनदेखी लेकिन अच्छी प्रतिक्रिया है। –

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