पायथन बेहद सुरुचिपूर्ण भाषा है। खैर, छोड़कर ... आयात को छोड़कर। मैं अभी भी इसे मेरे लिए प्राकृतिक लगने के तरीके से काम नहीं कर सकता।सर्कुलर आयात नरक
मेरे पास कक्षा MyObjectA
है जो फ़ाइल mypackage/myobjecta.py
में है। यह ऑब्जेक्ट कुछ उपयोगिता फ़ंक्शंस का उपयोग करता है जो mypackage/utils.py
में हैं। तो myobjecta.py
में मेरी पहली लाइनों में मैं लिखने:
from mypackage.utils import util_func1, util_func2
लेकिन उपयोगिता कार्यों में से कुछ बना सकते हैं और नए उदाहरणों लौट MyObjectA
की। तो मुझे utils.py
में लिखना होगा:
from mypackage.myobjecta import MyObjectA
ठीक है, नहीं, मैं नहीं कर सकता। यह एक गोलाकार आयात है और पायथन ऐसा करने से इंकार कर देगा।
इस मुद्दे के बारे में यहां कई सवाल हैं, लेकिन कोई भी संतोषजनक उत्तर नहीं दे रहा है। जो मैं सभी उत्तरों में पढ़ सकता हूं उससे:
- अपने मॉड्यूल को पुनर्गठित करें, आप इसे गलत कर रहे हैं! लेकिन मुझे पता नहीं है कि मेरे मॉड्यूल को इतनी सरल स्थिति में व्यवस्थित करना कितना बेहतर है क्योंकि प्रस्तुत किया गया है।
- सिर्फ
import ...
बल्किfrom ... import ...
से (व्यक्तिगत रूप से मैं लिख सकते हैं और संभवतः सभी पूर्ण नाम क्वालिफायर refactor करने के लिए नफरत है, मैं वास्तव में क्या मैं बाहर की दुनिया से मॉड्यूल में आयात कर रहा हूँ देखने के लिए प्यार करता हूँ) की कोशिश करो। क्या इससे मदद मिलेगी? मुझे यकीन नहीं है, अभी भी परिपत्र आयात हैं। - हैक करें जैसे कि अन्य मॉड्यूल से कुछ उपयोग करने से पहले एक फ़ंक्शन बॉडी के आंतरिक दायरे में कुछ आयात करें।
मुझे अभी भी उम्मीद है कि समाधान संख्या 4 है) जो कार्यात्मक और सुरुचिपूर्ण और सरल और काम करने के अर्थ में पाइथोनिक होगा। या नहीं है?
नोट: मैं मुख्य रूप से एक सी ++ प्रोग्रामर हूं, ऊपर दिया गया उदाहरण इसी तरह के हेडर सहित आसानी से सुलझाया गया है कि मुझे विश्वास नहीं है कि यह पायथन में संभव नहीं है।
def some_function():
import logging
do_some_logging()
आमतौर पर ImportError
ही क्योंकि जिस तरह से import()
के उठाए गए हैं पूरी फ़ाइल के शीर्ष स्तर स्टेटमेंट का मूल्यांकन करता है जब कहा जाता है:
आप जो कहते हैं उससे, मैं या तो MyObjectA को utils.py में डाल दूंगा क्योंकि कुछ उपयोगिता फ़ंक्शन इसे वापस कर देते हैं, या मैं उपयोगिता फ़ंक्शन डालता हूं जो myobjecta.py में MyObjectA देता है। लेकिन इसका जवाब 1) – DainDwarf
मैंने अजगर परिपत्र आयात की खोज की और कई प्रश्न पाए। क्या आपने खोज की –
@ डेन: हाँ, निश्चित रूप से ऐसा कर सकता है अगर उपयोगिता फ़ंक्शन केवल MyObjectA लौटाते हैं। लेकिन क्या होगा यदि वे MyObjectB या MyObjectC आदि भी लौट सकें –