मैं पायथन लिपि में मॉड्यूल आयात करने वाली एक दीवार में चला गया हूं। मैं इस त्रुटि का वर्णन करने के लिए अपनी पूरी कोशिश करूँगा कि मैं इसमें क्यों दौड़ता हूँ, और मैं अपनी समस्या को हल करने के लिए इस विशेष दृष्टिकोण को क्यों बांध रहा हूँ (जिसका वर्णन मैं एक सेकंड में करूँगा):
मान लें कि मेरे पास एक मॉड्यूल है जिसमें मैंने कुछ उपयोगिता फ़ंक्शंस / कक्षाएं परिभाषित की हैं, जो नामस्थान में परिभाषित संस्थाओं का उल्लेख करते हैं जिसमें यह सहायक मॉड्यूल आयात किया जाएगा ("a" ऐसी इकाई हो)
मॉड्यूल 1:
def f():
print a
और फिर मेरे पास मुख्य कार्यक्रम है, जहां "ए" परिभाषित है, जिसमें मैं उन उपयोगिताओं को आयात करना चाहता हूं:
import module1
a=3
module1.f()
प्रोग्राम को निष्पादित करने से निम्नलिखित त्रुटि हो जाएगी:
Traceback (most recent call last):
File "Z:\Python\main.py", line 10, in <module>
module1.f()
File "Z:\Python\module1.py", line 3, in f
print a
NameError: global name 'a' is not defined
इसी तरह के सवाल अतीत में पूछे गए हैं (दो दिन पहले, डीएयूएच) और कई समाधान सुझाए गए हैं, हालांकि मैं वास्तव में इन आवश्यकताओं को नहीं समझता हूं। यहाँ मेरा विशेष संदर्भ है:
मैं एक पायथन प्रोग्राम बनाने की कोशिश कर रहा हूं जो एक MySQL डेटाबेस सर्वर से जुड़ता है और GUI के साथ डेटा को प्रदर्शित / संशोधित करता है। स्वच्छता की खातिर, मैंने एक अलग फ़ाइल में सहायक / उपयोगिता MySQL से संबंधित कार्यों का गुच्छा परिभाषित किया है। हालाँकि, वे सभी एक सामान्य चर है, जिसे मैंने मूल रूप से उपयोगिताओं के मॉड्यूल के अंदर परिभाषित किया था , और जो MySQLdb मॉड्यूल से कर्सर ऑब्जेक्ट है। मुझे बाद में एहसास हुआ कि कर्सर ऑब्जेक्ट (जो db सर्वर के साथ संचार करने के लिए उपयोग किया जाता है) को मुख्य मॉड्यूल में परिभाषित किया जाना चाहिए, ताकि मुख्य मॉड्यूल और इसमें आयात होने वाली कोई भी चीज उस वस्तु तक पहुंच सके।
अंतिम परिणाम कुछ इस तरह होगा:
utilities_module.py:
def utility_1(args):
code which references a variable named "cur"
def utility_n(args):
etcetera
और मेरा मुख्य मॉड्यूल:
program.py:
import MySQLdb, Tkinter
db=MySQLdb.connect(#blahblah) ; cur=db.cursor() #cur is defined!
from utilities_module import *
और फिर, जैसे ही मैं किसी भी उपयोगिताओं के कार्यों को कॉल करने का प्रयास करता हूं, यह उपरोक्त "वैश्विक नाम" इस त्रुटि को परिभाषित नहीं करता है।
एक विशेष सुझाव इस तरह के रूप में उपयोगिताओं फ़ाइल में एक "प्रोग्राम आयात कर् से" बयान था:
utilities_module.py:
from program import cur
#rest of function definitions
program.py:
import Tkinter, MySQLdb
db=MySQLdb.connect(#blahblah) ; cur=db.cursor() #cur is defined!
from utilities_module import *
लेकिन यह चक्रीय आयात या ऐसा कुछ और नीचे की रेखा है, यह भी दुर्घटनाग्रस्त हो जाता है। तो मेरा सवाल है:
नरक में मैं मुख्य मॉड्यूल में परिभाषित "वक्र" ऑब्जेक्ट कैसे बना सकता हूं, उन सहायक कार्यों के लिए दृश्यमान है जो इसे आयात किए जाते हैं?
यदि आपके समाधान के लिए कहीं और पोस्ट किया गया है, तो अपने समय और मेरी गहरी माफी के लिए धन्यवाद। मैं अभी स्वयं उत्तर नहीं पा रहा हूँ और मुझे अपनी पुस्तक में और कोई तरकीब नहीं मिली है।
db(और curएक अलग मॉड्यूल दोनों कि में अगर आप जोर देते हैं,) programऔर utilities_moduleसे आयात। इस तरह से आपको परिपत्र निर्भरता नहीं मिलती है (मॉड्यूल से प्रोग्राम आयात करता है जो प्रोग्राम आयात करता है) और उनके साथ आने वाला भ्रम।
fetch_allऔर दो सूचियों के माध्यम से पुनरावृति कर सकते हैं , या बस इसलिए कि आपके पास दो अलग-अलग धागे / ग्रीनलेट / कॉलबैक-चेन / जो भी बिना संघर्ष के डेटाबेस का उपयोग कर रहे हैं)।