2015-11-01 7 views
8

मैं एक अन्य समारोह अपने पैकेज के __init__.py फ़ाइल में निम्नलिखित तरीके से लेन करने के लिए आवंटित करने के लिए करना चाहते हैं:__init__.py में लेन अधिभावी - अजगर

llen = len 
len = lambda x: llen(x) - 1 

यह ठीक काम करता है, लेकिन केवल __init__.py फ़ाइल में। मैं इसे अपने पैकेज में अन्य मॉड्यूल को कैसे प्रभावित कर सकता हूं?

उत्तर

2

जब आप एक ऐसा नाम लोड करने का प्रयास करते हैं जिसे मॉड्यूल-स्तरीय वैश्विक या फ़ंक्शन लोकल के रूप में परिभाषित नहीं किया जाता है, तो पाइथन इसे __builtin__ (builtins पायथन 3) मॉड्यूल में देखता है। पायथन के दोनों संस्करणों में, यह मॉड्यूल वैश्विक दायरे में __builtins__ के रूप में भी उपलब्ध है। आप इस मॉड्यूल को संशोधित कर सकते हैं और इससे न केवल आपके कोड को प्रभावित किया जाएगा, लेकिन आपके कोड के बाद कहीं भी कोई पायथन कोड चलता है !!

import __builtin__ as builtins # import builtins in python 3 
llen = len 
builtins.len = lambda a:llen(a) - 1 
+0

धन्यवाद! मेरे लिए ठीक काम किया :) – DorianOlympia

+1

** '__builtins__' CPython में एक निजी कार्यान्वयन विवरण है। ** आपको स्पष्ट रूप से 'बिल्टिन' मॉड्यूल (या 'पायथन 2 में' __builtin__') को स्पष्ट रूप से आयात करना चाहिए। – ppperry

4

यह वह उत्तर नहीं हो सकता है जिसे आप ढूंढ रहे हैं, लेकिन अगर मैं आप थे तो मैं ऐसा नहीं करूँगा (और मुझे पूरा यकीन है कि आप आसानी से नहीं कर सकते हैं)।

कारण यह नहीं होना चाहिए कि पाइथन कुछ परिचालन करने के लिए आंतरिक रूप से len का उपयोग करता है। एक और कारण शुद्ध टूटा तर्क है। ऊपर वर्णित आपका len फ़ंक्शन खाली सूचियों या खाली चीज़ों के लिए ऋणात्मक लंबाई लौटाएगा। यह मेरे लिए काफी टूटा लगता है।

आप कर सकते हैं, केवल कुछ वर्गों पर लंबाई विधि को ओवरराइड कर सकते हैं (इससे आपके लिए बहुत समझ हो सकती है)। के लिए यह आप ऑपरेटर ओवरलोडिंग उपयोग कर सकते हैं, बस अपने वर्ग में विधि __len__ ओवरराइड:

class MyList(object): 
    def __len__(self,): 
     # Do your thing 

तुम भी मेटा वर्गों में देखने के लिए चाहते हो सकता है, वहाँ इस विषय पर एक बहुत अच्छा stack overflow सवाल है।

+0

मैं आपसे सहमत हूं! मुझे पता है कि ऐसा व्यवहार वास्तव में अपरिपक्व नहीं है। लेकिन यह कोड मेरे विश्वविद्यालय के होमवर्क का हिस्सा है। मुझे बग खोजने के लिए वास्तव में कष्टप्रद और कठिन के साथ एक प्रोग्राम बनाना है। मैंने सोचा कि एक आसान और अक्सर इस्तेमाल किए जाने वाले फ़ंक्शन (जैसे लेन) के लिए कुछ अलग करना एक अच्छा विचार है! :) – DorianOlympia

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