दिलचस्प पोस्ट
उसी क्लिकदृश्य में किसी अन्य क्लिक करने योग्य स्प्रैन्स को प्रभावित किए बिना दबाए जाने के बाद एकल क्लिक करने योग्यस्पैन के टेक्स्ट का रंग बदलें UITableViewCell सफेद पृष्ठभूमि दिखाता है और IOS7 पर संशोधित नहीं किया जा सकता कमांड लाइन स्ट्रिंग की अधिकतम लंबाई मैं कॉफी स्क्रिप्ट में वैश्विक चर को कैसे परिभाषित करूं? एंड्रॉइड – मेरे आवेदन में उपयोग किए जाने वाले वॉल्यूम बटन जावा – पारदर्शी JScrollPane इनपुट / आउटपुट स्ट्रीम के साथ जावा प्रक्रिया कैसे एक फाइल में NSLog पायथन में कम से कम यूआरएल-सुरक्षित स्ट्रिंग में एक पूर्णांक कैसे परिवर्तित करें? फ़ायरफ़ॉक्स को संस्करण 50 में अपडेट करने के बाद क्यों फ़ायरबग निकाल दिया गया? Guice का उपयोग करते हुए सामान्य कार्यान्वयन इंजेक्शन अजाक्स से PHP स्क्रिप्ट के साथ सरणी भेजें event.preventDefault () फ़ंक्शन IE में काम नहीं कर रहा है nginx – client_max_body_size का कोई प्रभाव नहीं है गिथूब: मेरी निजी रिपॉजिटरी क्लोन करना त्रुटि

पायथन में परिपत्र आयात से कैसे बचें?

मुझे पता है कि अजगर में परिपत्र आयात का मुद्दा कई बार सामने आया है और मैंने इन चर्चाओं को पढ़ लिया है। इन चर्चाओं में बार-बार टिप्पणी की गई है कि एक परिपत्र आयात खराब डिजाइन का संकेत है और परिपत्र आयात से बचने के लिए कोड को पुनर्गठित किया जाना चाहिए।

क्या कोई मुझे बता सकता है कि इस परिस्थिति में परिपत्र आयात से कैसे बचें ?: मेरे पास दो कक्षाएं हैं और मैं चाहता हूं कि हर कक्षा में एक कन्स्ट्रक्टर (विधि) हो, जो दूसरे वर्ग का एक उदाहरण लेता है और क्लास का एक उदाहरण देता है।

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

मैं एक ही मॉड्यूल में दोनों वर्ग की परिभाषा डाल सकता था। क्या कोई अन्य सुझाव हैं?

एक खिलौना उदाहरण क्लास ए होगा, जिसमें एक विशेषता है जो एक सूची और वर्ग बी है जिसमें एक विशेषता है जो एक ट्यूपल है। फिर क्लास ए में एक विधि है जो क्लास बी का एक उदाहरण लेता है और वर्ग ए (उदाहरण के लिए टपल को सूची में परिवर्तित करके) का एक उदाहरण देता है और इसी प्रकार कक्षा बी में एक विधि होती है जो क्लास ए का एक उदाहरण लेती है और वर्ग बी का एक उदाहरण देता है (सूची को ट्यूपल में परिवर्तित करके)

वेब के समाधान से एकत्रित समाधान "पायथन में परिपत्र आयात से कैसे बचें?"

केवल मॉड्यूल आयात करें, मॉड्यूल से आयात न करें:

a.py पर विचार करें:

 import b class A: def bar(self): return bB() 

और b.py :

 import a class B: def bar(self): return aA() 

यह पूरी तरह से ठीक काम करता है

निम्नलिखित उदाहरण अजगर पैकेज पर विचार करें जहां a.py और b.py एक दूसरे पर निर्भर हैं:

 /package __init__.py a.py b.py 

अजगर में एक मॉड्यूल आयात करने के कई तरीके हैं

 import package.a # Absolute import import package.a as a_mod # Absolute import bound to different name from package import a # Alternate absolute import import a # Implicit relative import (deprecated, py2 only) from . import a # Explicit relative import 

दुर्भाग्यवश, केवल 1 और 4 विकल्प वास्तव में काम करते हैं जब आपके पास परिपत्र निर्भरता होती है (बाकी सभी ImportError या AttributeError ImportError )। सामान्य तौर पर, आपको 4 वां वाक्यविन्यास का उपयोग नहीं करना चाहिए, क्योंकि यह केवल python2 में काम करता है और अन्य तृतीय पक्ष मॉड्यूल के साथ संघर्ष करने का जोखिम चलाता है। तो वास्तव में, केवल पहला वाक्य रचना काम करने की गारंटी है। हालांकि, परिपत्र निर्भरता के साथ काम करते समय आपके पास अभी भी कई विकल्प हैं।

संपादित करें: आयात ImportError और AttributeError समस्या केवल पायथन 2 में होती है। अजगर 3 में आयात मशीनरी को फिर से लिखा गया है और इन सभी आयात स्टेटमेंट (4 के अपवाद के साथ) काम करेंगे, परिपत्र निर्भरता के साथ भी।

पूर्ण आयात का उपयोग करें

बस ऊपर दिए गए पहले आयात सिंटैक्स का उपयोग करें इस विधि के नकारात्मक पक्ष यह है कि आयात के नाम बड़े पैकेजों के लिए सुपर लंबे हो सकते हैं।

a.py

 import package.b 

b.py

 import package.a 

बाद में आयात को छोड़ दें

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

a.py

 def func(): from package import b 

b.py

 def func(): from package import a 

केंद्रीय मॉड्यूल में सभी आयात करें

यह भी काम करता है, लेकिन पहली विधि के समान समस्या है, जहां सभी पैकेज और सबकुशन कॉल को सुपर लम्बे मिलता है। इसमें दो प्रमुख खामियां भी हैं- यह सब डिब्बों को आयात करने के लिए मजबूर करती है , भले ही आप केवल एक या दो का इस्तेमाल कर रहे हों, और आप अभी भी किसी भी पाइप में नहीं देख सकते हैं और जल्दी से अपनी निर्भरता देख सकते हैं, तो आप कार्यों के माध्यम से sifting जाना है

__init__.py

 from . import a from . import b 

a.py

 import package def func(): package.b.some_object() 

b.py

 import package def func(): package.a.some_object() 

तो ये आपके विकल्प हैं (और वे सभी तरह आईएमओ को चूसते हैं) सच कहूँ तो, यह अजगर आयात मशीनरी में एक तेज बग लगता है, लेकिन यह सिर्फ मेरी राय है

हम बेहतर रीडिंग और कम एक्सेस स्ट्रिंग के लिए पूर्ण आयात और फ़ंक्शन के संयोजन करते हैं।

  • लाभ: शुद्ध निरपेक्ष आयात की तुलना में कम एक्सेस स्ट्रिंग
  • नुकसान: अतिरिक्त फ़ंक्शन कॉल के कारण थोड़ी अधिक भूमि के ऊपर की ओर

मुख्य / उप / a.py

 import main.sub.b b_mod = lambda: main.sub.b class A(): def __init__(self): print('in class "A":', b_mod().B.__name__) 

मुख्य / उप / b.py

 import main.sub.a a_mod = lambda: main.sub.a class B(): def __init__(self): print('in class "B":', a_mod().A.__name__)