আমি পাইথন স্ক্রিপ্টে একটি প্রাচীর আমদানি করে মডিউলগুলির একটি অংশে চলে এসেছি। আমি ত্রুটিটি বর্ণনা করার জন্য যথাসাধ্য চেষ্টা করব, আমি কেন এটি চালাচ্ছি এবং কেন আমার সমস্যা সমাধানের জন্য আমি এই বিশেষ পদ্ধতির সাথে বেঁধে দিচ্ছি (যা আমি একটি সেকেন্ডে বর্ণনা করব):
ধরা যাক আমার কাছে একটি মডিউল আছে যাতে আমি কিছু ইউটিলিটি ফাংশন / ক্লাস সংজ্ঞায়িত করেছি, যা নামস্থানে সংজ্ঞায়িত সংস্থাগুলি উল্লেখ করে যেখানে এই সহায়ক মডিউলটি আমদানি করা হবে (আসুন "একটি" যেমন একটি সত্তা হয়ে উঠুক):
মডিউল 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
অতীতে অনুরূপ প্রশ্ন জিজ্ঞাসা করা হয়েছিল (দু'দিন আগে, ডিউহ) এবং বেশ কয়েকটি সমাধান প্রস্তাব দেওয়া হয়েছে, তবে আমি সত্যিই মনে করি না যে এগুলি আমার প্রয়োজনীয়তার সাথে খাপ খায়। এখানে আমার বিশেষ প্রসঙ্গ:
আমি একটি পাইথন প্রোগ্রাম তৈরি করার চেষ্টা করছি যা মাইএসকিউএল ডাটাবেস সার্ভারের সাথে সংযুক্ত হয় এবং জিইউআই দিয়ে ডেটা প্রদর্শন / সংশোধন করে। পরিচ্ছন্নতার স্বার্থে, আমি একটি পৃথক ফাইলে সহায়িক / ইউটিলিটি মাইএসকিউএল-সম্পর্কিত ফাংশনগুলির সংশ্লেষকে সংজ্ঞায়িত করেছি। তবে তাদের সকলের একটি সাধারণ পরিবর্তনশীল রয়েছে, যা আমি মূলত ইউটিলিটি মডিউলের ভিতরে সংজ্ঞায়িত করেছি এবং এটি মাইএসকিউএলডিবি মডিউল থেকে কার্সার অবজেক্ট। আমি পরে বুঝতে পারি যে কার্সার অবজেক্ট (যা ডিবি সার্ভারের সাথে যোগাযোগের জন্য ব্যবহৃত হয়) প্রধান মডিউলে সংজ্ঞায়িত করা উচিত, যাতে মূল মডিউল এবং এতে যে আমদানি করা হয় উভয়ই সেই বস্তুটি অ্যাক্সেস করতে পারে।
শেষ ফলাফলটি এরকম কিছু হবে:
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
থেকে এটা আমদানি করুন। এইভাবে আপনি বিজ্ঞপ্তি নির্ভরতা (প্রোগ্রামটি আমদানি করে মডিউলগুলি থেকে প্রোগ্রাম আমদানি করে) এবং তাদের সাথে যে বিভ্রান্তি আসে তা পান না get
fetch_all
এবং পরিবর্তে দুটি তালিকার মাধ্যমে পুনরাবৃত্তি করতে পারেন) , বা ঠিক তাই আপনার দুটি ভিন্ন থ্রেড / গ্রিনলেট / কলব্যাক-চেইন / কোনও দ্বন্দ্ব ছাড়াই ডাটাবেস ব্যবহার করা যায়)।