2014-05-20 6 views
14

मैं एक ऐसे प्रोजेक्ट पर काम कर रहा हूं जिसका लक्ष्य आंशिक क्रम जानकारी के साथ पाइथन सॉकेट संदेशों को बढ़ाने का है। लाइब्रेरी जो मैं बना रहा हूं वह पाइथन में लिखा गया है, और सॉकेट फ़ंक्शंस के माध्यम से भेजे गए मौजूदा सिस्टम के संदेशों पर इंटरऑप किए जाने की आवश्यकता है।आयात तंत्र को जोड़ने की तुलना में कस्टम वर्गों के साथ पाइथन सिस्टम कक्षाओं को विलय क्यों कर रहा है?

मैं संसाधनों के कुछ वहाँ बाहर इस सवाल python-importing-from-builtin-library-when-module-with-same-name-exist

एक बेहद बदसूरत और भयानक बात आप कर सकते हैं नहीं है पर @Omnifarious द्वारा अर्थात् जवाब को पढ़ लिया है, कि आयात तंत्र नहीं hooking शामिल है । यह कुछ ऐसा है जो आपको संभवतः नहीं करना चाहिए, लेकिन यह संभवतः काम करेगा। यह सिस्टम कैलेंडर मॉड्यूल की एक संकर और अपने कैलेंडर मॉड्यूल में अपने कैलेंडर मॉड्यूल बदल जाता है।

मैंने आयात तंत्र समाधान लागू किया है, लेकिन हमने फैसला किया है कि यह वह दिशा नहीं है जिसे हम लेना चाहते हैं, क्योंकि यह पर्यावरण पर बहुत अधिक निर्भर करता है। आयात तंत्र पर भरोसा करने के बजाए कक्षाओं को हाइब्रिड में विलय करने का समाधान, मेरे मामले में सबसे अच्छा तरीका प्रतीत होता है।

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

कोड स्निपेट जहां क्षेपक सॉकेट संदेश रोकना भेजे जाने से पहले की जरूरत है:

class vector_clock: 

    def __init__(self): 
    """ 
    Initiate the clock with the object 
    """ 
    self.clock = [0,0] 

    def sendMessage(self): 
    """ 
    Send Message to the server 
    """ 
    self.msg = "This is the test message to that will be interposed on" 
    self.vector_clock.increment(0) # We are clock position 0 

    # Some extraneous formatting details removed for brevity…. 
    # connectAndSend needs interpositioning to include the vector clock 

    self.client.connectAndSend(totalMsg); 
    self.client.s.close() 
+2

कृपया सवाल करें कि सवाल क्या है। मुझे लगता है कि आपको एक डाउनवोट प्राप्त हुआ है क्योंकि यह स्पष्ट नहीं है कि आप क्या पूछ रहे हैं। – kapa

+0

@kapa आपके सुझाव के लिए बहुत बहुत धन्यवाद! मैं स्पष्ट करने के लिए संपादित करेंगे। – jspacek

+2

शीर्षक लगता है जैसे आप ट्रॉलिंग कर रहे हैं, उद्धरण नहीं:/ – Will

उत्तर

2

अपनी पोस्ट की मेरी समझ से, आप में अपनी खुद की कार्यक्षमता इंजेक्षन करने के लिए मौजूदा सॉकेट पुस्तकालय संशोधित करना चाहते हैं यह।

हाँ, यह पूरी तरह से संभव है, और संभवतः यह भी आपकी समस्या का सबसे आसान समाधान है, लेकिन आप क्या कर रहे हो के निहितार्थ के सभी पर विचार करने के लिए है।

सबसे महत्वपूर्ण बात यह है कि आप बस अपने आप के लिए सॉकेट को संशोधित नहीं कर रहे हैं है, लेकिन कुछ भी है कि में अपनी प्रक्रिया जब तक यह का उपयोग करता है यह ही वर्ग लोडर है जो सॉकेट लाइब्रेरी का उपयोग करता के किसी भी भाग से चलाया जाता है के लिए। मैं समझता हूं कि शायद कुछ मौजूदा लाइब्रेरी है जिसका आप उपयोग कर रहे हैं जो सॉकेट का उपयोग करता है और आप इसमें इस कार्यक्षमता को इंजेक्ट करना चाहते हैं, लेकिन यह सब कुछ प्रभावित करेगा।

यह आपके प्रश्न पर विचार करने के लिए है से: अपने परिवर्तन 100% पीछे की ओर संगत है। जब तक आप सुनिश्चित कर सकते हैं आप अपने प्रक्रिया द्वारा प्रयोग किया जाता है किसी भी पुस्तकालय द्वारा सॉकेट के हर एक का उपयोग मामला पता है कि (संकेत: क्या नहीं कर सकते हैं), तो आप यकीन है कि यह पूरी तरह से सड़क के नीचे सभी मौजूदा कार्यक्षमता को बरकरार रखता है या कहीं और बनाने की जरूरत है कुछ मूल पुस्तकालय में सामान रहस्यमय रूप से तोड़ने जा रहा है और आपको पता नहीं चलेगा कि इसे डीबग करने का कोई तरीका क्यों नहीं है। 100% पिछड़ा संगत (या जितना संभव हो उतना करीब है) का एक उदाहरण एक सजावट इंजेक्शन दे रहा है जो आपके स्वयं के मॉड्यूल में से एक को समय की जानकारी बचाता है।

आप पूरी तरह से इस बात को समझ लेकिन आपको फिर भी लगता है कि अपने समाधान एक अच्छा तो मैं कहता हूँ "इसके लिए जाना है।" हालांकि, क्या आपने कोई विकल्प माना है?

तुम सिर्फ पुस्तकालयों कि आप का उपयोग का एक विशिष्ट सेट के लिए इस कार्यक्षमता इंजेक्षन करने की जरूरत है, तो मैं कुछ ऐसा कर रही सुझाव है पैचिंग: https://docs.python.org/3/library/unittest.mock.html#unittest.mock.patch

आप उपवर्ग सकता है आप को संशोधित करें और पैच करने के लिए चाहते हैं जो कुछ भी कोर पुस्तकालय पुस्तकालय इसके बजाय अपनी कक्षा का उपयोग करने के लिए। इसके मूल में, पैच क्या करता है यह लक्ष्य मॉड्यूल में उपयोग की जाने वाली वैश्विक बाइंडिंग को मूल रूप से उपयोग किए जाने वाले किसी भिन्न वर्ग/मॉड्यूल का उपयोग करने के लिए संशोधित करता है।

पीएस। मुझे नहीं लगता कि तुम्हारी एक ऐसी स्थिति है जो आयात तंत्र को जोड़ने की मांग करती है।

+0

मेरी वेक्टर टाइमस्टैम्प लाइब्रेरी में मेरी __init__.py फ़ाइल 'patcher = mock.patch (' __ मुख्य __। Socket.socket ', SVSocket.SVSocket) के साथ एक स्थिर फ़ंक्शन कॉल करती है। एक मुश्किल मुद्दा पैच को रोक रहा था ताकि मैं सजावटी एसवीएसकेट कक्षा के अंदर एक सादा सॉकेट सॉकेट चर बना सकूं। इसके लिए, मैंने 'mock.patch.stopall()' का उपयोग किया। एक काम प्रगति पर है, लेकिन पूर्ण कोड यहां है यदि यह कुछ उपयोग है https://bitbucket.org/bestchai/shivector/src/default/python/ – jspacek

+0

'mock.patch.stopall()' में कोई समस्या है http://bugs.python.org/issue21239। Mock.py का एक निश्चित संस्करण उस लिंक में शामिल है जिसे मैंने पायथन संस्करण <3.5 के लिए बड़ी सफलता के साथ उपयोग किया है। – jspacek

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