पायथन मॉड्यूल कभी-कभी अपने उप-मॉड्यूल को आयात क्यों नहीं करते हैं?


88

मैंने आज कुछ अजीब सा देखा जो मुझे समझाया गया है। मुझे 100% यकीन नहीं था कि इसे एक प्रश्न के रूप में भी कैसे वाक्यांश दिया जाए, इसलिए Google प्रश्न से बाहर है। लॉगिंग मॉड्यूल में किसी विषम कारण के लिए मॉड्यूल लॉगिंग.हैंडलर तक पहुंच नहीं है। यदि आप मुझ पर विश्वास नहीं करते हैं तो स्वयं इसे आज़माएँ:

>>> import logging
>>> logging.handlers
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'handlers'
>>> import logging.handlers
>>> logging.handlers
<module 'logging.handlers' from '/usr/lib/python2.6/logging/handlers.pyc'>

क्या कोई समझा सकता है कि ऐसा क्यों होता है?

जवाबों:


119

पायथन में, मॉड्यूल सुलभ होने से पहले आयात किए जाने की आवश्यकता है। import loggingसिर्फ लॉगिंग मॉड्यूल आयात करता है। ऐसा होता है कि loggingसबमोडुल्स के साथ एक पैकेज होता है , लेकिन उन सबमॉड्यूल्स अभी भी स्वचालित रूप से लोड नहीं होते हैं। इसलिए, आपको logging.handlersइसे एक्सेस करने से पहले स्पष्ट रूप से आयात करने की आवश्यकता है।

यदि आप सोच रहे हैं कि ऐसा क्यों लगता है कि कभी-कभी आपको उन अतिरिक्त आयातों की आवश्यकता नहीं होती है: कुछ पैकेज आयात किए जाने पर कुछ या सभी सबमॉड्यूल आयात करते हैं - बस उन __init__.pyफ़ाइलों में आयात करके । अन्य मामलों में यह हो सकता है कि कुछ और जो आप आयात करते हैं, वह भी आयातित logging.handlers। इससे कोई फर्क नहीं पड़ता कि कौन सा कोड आयात करता है; जब तक आप इसे एक्सेस करने से पहले अपनी प्रक्रिया में कुछ आयात logging.handlersकरते हैं, तब तक यह होगा। और कभी-कभी एक पैकेज की तरह दिखने वाला एक मॉड्यूल वास्तव में एक नहीं होता है, जैसे osऔर os.pathosपैकेज नहीं है, यह सिर्फ सही अन्य मॉड्यूल (आपके प्लेटफॉर्म के लिए) आयात करता है और इसे कॉल करता है path, बस इसलिए आप इसे एक्सेस कर सकते हैं os.path


4

मैं अजगर के लिए भी नया हूं और बहुत अभ्यास करने के बाद अब मैं पैकेज (फ़ोल्डर), मॉड्यूल (.py), कक्षाएं, चर ... आदि के बीच अंतर कर सकता हूं।

यदि आप अपने किसी भी फ़ोल्डर को अजगर पैकेज बनाना चाहते हैं - इसमें __init__.pyफ़ाइल होनी चाहिए यहां तक ​​कि खाली फ़ाइल भी करेगी !!!

और जैसा कि थॉमस ने कहा, __init__.pयदि आप चाहते हैं तो आप y में अतिरिक्त मॉड्यूल आयात कर सकते हैं !!! लेकिन मॉड्यूल / पैकेज इसे आयात करने के बाद ही सुलभ हैं ...

यदि आप एक मॉड्यूल से सब कुछ आयात करना चाहते हैं जो आप उपयोग कर सकते हैं

from logging import *

बाकी आप नीचे दिए गए हैंडलर मॉड्यूल को भी एक्सेस कर सकते हैं,

from logging import handlers
print dir(handlers)


5
कृपया उपयोग न करें from module import *। यह लगभग हमेशा एक गलती है।
थॉमस वाउटर्स

यदि आप चाहते हैं कि किसी पैकेज में सब कुछ अपने आप आयात हो जाए, तो वे सभी init .py में सेट करने के बजाय, init .py में आयात करें और कहीं से 'पैकेज इंपोर्ट *' कर लें।
थॉमस वाउचर

2
@Pete: क्योंकि यह मानक नामस्थान को "प्रदूषित" करता है जिससे अस्पष्टता और संघर्ष होता है। अगर मेरे पास होता import zipperऔर zipper.open()आपको पता होता कि मैं कौन सा फोन खोल रहा हूं। इसके from zipper import *बाद open()कंट्राइवाइज बिल्ट-इन ओपन या ज़िपर है। कुछ या कुछ और। import zipper as zयदि आप टाइप करते हुए थक जाते हैं तो बहुत पसंद किया जाता हैzipper
msw

3
@ पता: यह भी एक समस्या है क्योंकि आप अनजाने में अपने कुछ नामस्थान को अधिलेखित कर सकते हैं। मैं तब से उपयोग करता था numpy import *क्योंकि कुछ सुन्न कार्य तब तक काम नहीं करते हैं जब तक कि आप सभी सुन्न (उनके भाग आईएमओ पर भयानक डिजाइन दोष) का आयात नहीं करते हैं, लेकिन खस्ता एक बड़ी संख्या में ऑब्जेक्ट हैं जो इसे आयात करते हैं। मैंने बहुत सारे कार्यों को अधिलेखित कर दिया (मेरा मानना ​​है कि प्रतिलिपि एक थी ... मैं जांच करने के लिए बहुत थक गया हूं)। अब मैं numpy को np के रूप में आयात करता हूँ अगर मैं numpy का उपयोग करने जा रहा हूँ तो मैं इसे बार-बार टाइप करने के लिए खड़ा नहीं हो सकता।
चेरिसौली

2
@ डस्टिनैचोस, कौन से संख्यात्मक कार्य में दोष है?
विंस्टन इर्वर्ट

2

थॉमस वाउटर्स ने इस सवाल का बहुत अच्छा जवाब दिया, लेकिन अफसोस, मुझे मूल दस्तावेज में उत्तर खोजने के बाद ही यह सवाल मिला। उस अंत तक मुझे लगा कि मैं इस उम्मीद में इसे जोड़ दूंगा कि यह भविष्य में खोज इंजन के शीर्ष के करीब है।

सवाल

त्रुटि क्यों होती है: ' AttributeError: मॉड्यूल' mod_name 'में कोई विशेषता नहीं है' sub_module_name 'भले ही मेरा संपादक (जैसे विज़ुअल कोड) उप-मॉड्यूल नाम को स्वतः पूर्ण करता है:

 import module_name
 module_name.sub_module_name(parameter)

उत्तर

आपका संपादक आपकी परियोजना की फ़ाइल संरचना के स्वत: पूर्ण होने का आधार बना रहा है, न कि पायथन व्यवहार का। जब आप एक मॉड्यूल आयात करते हैं तो उप-मॉड्यूल 'स्वचालित रूप से' आयात नहीं होते हैं। उपयोग करते समय उप-मॉड्यूल को 'स्वचालित रूप से' आयात करने के तरीके के विवरण के लिए संदर्भ पायथन प्रलेखन

 import module_name

'मॉड्यूल' या 'पैकेज' आयात करने का प्रयास करते समय इस उत्तर के साथ प्रमुख योगदान एट्रीब्यूटर के अतिरिक्त है।

आशा है कि यह किसी की मदद करता है!


1

मैंने हाल ही में उसी विषम स्थिति का सामना किया है। इसलिए, मैंने शर्त लगाई है कि आपने कुछ तृतीय-पक्षीय आयात को हटा दिया है। इसमें निहित देयता को हटा दिया गया है from logging import handlersया from logging import *आपको प्रदान किया गया है handlers। और अन्य स्क्रिप्ट में आपको कुछ पसंद आया है import loggingऔर बस इस्तेमाल किया है logging.handlersऔर आपने सोचा है कि यह एक तरह से काम है जैसा मैंने किया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.