python প্রোগ্রামিং টিউটোরিয়াল - পাইথন মধ্যে বিজ্ঞপ্তি (বা চক্রবর্তী) আমদানি




6 Answers

গত বছরের comp.lang.python এ এই বিষয়ে সত্যিই একটি ভাল আলোচনা ছিল। এটা বেশ পুঙ্খানুপুঙ্খভাবে আপনার প্রশ্নের উত্তর।

আমদানি সত্যিই সহজবোধ্য হয়। শুধু নিম্নলিখিত মনে রাখবেন:

'আমদানি' এবং 'xxx আমদানি yyy থেকে' এক্সিকিউটেবল বিবৃতি। চলমান প্রোগ্রাম যে লাইন পৌঁছানোর সময় তারা চালানো।

যদি একটি মডিউল sys.modules হয় না তবে একটি আমদানি sys.modules এ নতুন মডিউল এন্ট্রি তৈরি করে এবং তারপর মডিউল কোডটি চালায়। মৃত্যুদণ্ড কার্যকর না হওয়া পর্যন্ত এটি কলিং মডিউলটিতে নিয়ন্ত্রণ ফিরে আসে না।

Sys.modules এ একটি মডিউল বিদ্যমান থাকলে একটি এক্সপোর্ট কেবল মডিউলটি ফেরত পাঠায় কিনা তা কার্যকর করে। সেই কারণেই চকচকে আমদানিগুলি মডিউলগুলি ফিরে আসতে পারে যা আংশিকভাবে খালি বলে মনে হয়।

অবশেষে, execution script __main__ নামে একটি মডিউলে চালিত হয়, নিজের নামের অধীনে স্ক্রিপ্ট আমদানি করা __main__ এর সাথে সম্পর্কিত একটি নতুন মডিউল তৈরি করবে।

যে একসঙ্গে নিন এবং আপনি মডিউল আমদানি করার সময় কোন বিস্ময় পেতে হবে না।

সহজ ভাষায়

দুটি মডিউল একে অপরকে আমদানি করলে কী হবে?

সমস্যাটি সাধারণীকরণের জন্য পাইথনের সাইক্লিক আমদানি সম্পর্কে কী বলা যায়?




চকচকে আমদানি বন্ধ, কিন্তু আপনি সতর্কতা অবলম্বন করা আবশ্যক মডিউল প্রারম্ভকালে cyclically- আমদানি মডিউল ব্যবহার না।

নিম্নলিখিত ফাইল বিবেচনা করুন:

a.py:

print "a in"
import sys
print "b imported: %s" % ("b" in sys.modules, )
import b
print "a out"

b.py:

print "b in"
import a
print "b out"
x = 3

যদি আপনি a.py চালান, তবে আপনি নিম্নলিখিতগুলি পাবেন:

$ python a.py
a in
b imported: False
b in
a in
b imported: True
a out
b out
a out

B.py এর দ্বিতীয় আমদানিতে (দ্বিতীয়টি a in ), পাইথন ইন্টারপ্রেটারটি আবার আমদানি হয় না, কারণ এটি ইতিমধ্যে মডিউল নির্দেশে বিদ্যমান।

আপনি যদি মডিউল আরম্ভের সময় থেকে bx অ্যাক্সেস করার চেষ্টা করেন, আপনি একটি AttributeError

নিম্নলিখিত লাইনে a.py :

print b.x

তারপর, আউটপুট হয়:

$ python a.py
a in                    
b imported: False
b in
a in
b imported: True
a out
Traceback (most recent call last):
  File "a.py", line 4, in <module>
    import b
  File "/home/shlomme/tmp/x/b.py", line 2, in <module>
    import a
 File "/home/shlomme/tmp/x/a.py", line 7, in <module>
    print b.x
AttributeError: 'module' object has no attribute 'x'

কারণ মডিউলে আমদানি করা হয় এবং সময়ে সময়ে bx অ্যাক্সেস করা হয়, লাইন x = 3 এখনও কার্যকর করা হয়নি, যা শুধুমাত্র b out হওয়ার পরেই ঘটবে।




আমি এখানে একটি উদাহরণ পেয়েছিলাম যে আমাকে আঘাত!

foo.py

import bar

class gX(object):
    g = 10

bar.py

from foo import gX

o = gX()

main.py

import foo
import bar

print "all done"

কমান্ড লাইনে: $ python main.py

Traceback (most recent call last):
  File "m.py", line 1, in <module>
    import foo
  File "/home/xolve/foo.py", line 1, in <module>
    import bar
  File "/home/xolve/bar.py", line 1, in <module>
    from foo import gX
ImportError: cannot import name gX



সার্কুলার আমদানী বিভ্রান্তিকর হতে পারে কারণ আমদানি দুটি জিনিস করে:

  1. এটি আমদানি মডিউল কোড executes
  2. মডিউল গ্লোবাল প্রতীক টেবিল আমদানি আমদানি মডিউল যোগ করে

প্রাক্তন শুধুমাত্র একবার সম্পন্ন করা হয়, যখন পরের প্রতিটি আমদানি বিবৃতি। সার্কুলার আমদানি আংশিকভাবে কার্যকর কোড সহ একটি মডিউল ব্যবহার আমদানি যখন পরিস্থিতি সৃষ্টি করে। ফলস্বরূপ এটি আমদানি বিবৃতি পরে তৈরি বস্তু দেখতে হবে না। কোড নমুনা নীচে এটি প্রদর্শন করে।

সার্কুলার আমদানি সব খরচ এড়ানো এ চরম মন্দ নয়। ফ্লাস্কের মতো কিছু কাঠামোর মধ্যে তারা বেশ প্রাকৃতিক এবং তাদের কোডটি টিকিয়ে দেওয়ার জন্য কোডটি আরও ভাল করে না।

main.py

print 'import b'
import b
print 'a in globals() {}'.format('a' in globals())
print 'import a'
import a
print 'a in globals() {}'.format('a' in globals())
if __name__ == '__main__':
    print 'imports done'
    print 'b has y {}, a is b.a {}'.format(hasattr(b, 'y'), a is b.a)

b.by

print "b in, __name__ = {}".format(__name__)
x = 3
print 'b imports a'
import a
y = 5
print "b out"

a.py

print 'a in, __name__ = {}'.format(__name__)
print 'a imports b'
import b
print 'b has x {}'.format(hasattr(b, 'x'))
print 'b has y {}'.format(hasattr(b, 'y'))
print "a out"

মন্তব্য সঙ্গে Python main.py আউটপুট

import b
b in, __name__ = b    # b code execution started
b imports a
a in, __name__ = a    # a code execution started
a imports b           # b code execution is already in progress
b has x True
b has y False         # b defines y after a import,
a out
b out
a in globals() False  # import only adds a to main global symbol table 
import a
a in globals() True
imports done
b has y True, a is b.a True # all b objects are available



আমি নিম্নোক্ত সমস্যার সমাধান করেছি, এবং এটি কোন ত্রুটি ছাড়াই ভাল কাজ করে। দুটি ফাইল বিবেচনা করুন a.py এবং b.py

আমি এটি একটি যোগ করা a.py এবং এটি কাজ করে।

if __name__ == "__main__":
        main ()

a.py:

import b
y = 2
def main():
    print ("a out")
    print (b.x)

if __name__ == "__main__":
    main ()

b.py:

import a
print ("b out")
x = 3 + a.y

আউটপুট আমি পেতে

>>> b out 
>>> a out 
>>> 5



ঠিক আছে, আমি মনে করি আমার একটি সুন্দর শীতল সমাধান আছে। চলুন আপনি a ফাইল আছে এবং ফাইল b । ফাইল def আপনার একটি def বা একটি class রয়েছে যা আপনি মডিউলে ব্যবহার করতে চান তবে আপনার অন্য কোনও def , def , class , অথবা ভেরিয়েবল ফাইল থেকে আপনার সংজ্ঞা বা শ্রেণিতে প্রয়োজন। আপনি কী করতে পারেন ফাইল ফাইলের মধ্যে ফাংশন বা ক্লাস কল করার পরে, যা ফাইল b , কিন্তু ফাংশন বা ক্লাস থেকে কল করার আগে ফাইল b থেকে যা আপনি করতে পারেন, ফাইলটি b জন্য বলুন তাহলে import b , এবং ফাইল অংশে সমস্ত সংজ্ঞা বা ক্লাসগুলিতে, এখানে মূল অংশটি রয়েছে যা def বা def ফাইল থেকে (প্রয়োজনে এটি কল করুন) করতে হবে, আপনি from a import CLASS বলবেন

এটি কাজ করে কারণ আপনি ফাইল b কোনও আমদানি বিবৃতি নির্বাহ করে পাইথন ছাড়াই ফাইলটি আমদানি করতে পারেন এবং এইভাবে আপনি কোনও বিজ্ঞপ্তি আমদানি করতে পারেন।

উদাহরণ স্বরূপ:

একটি ফাইল করুন:

class A(object):

     def __init__(self, name):

         self.name = name

CLASS = A("me")

import b

go = B(6)

go.dostuff

ফাইল বি:

class B(object):

     def __init__(self, number):

         self.number = number

     def dostuff(self):

         from a import CLASS

         print "Hello " + CLASS.name + ", " + str(number) + " is an interesting number."

Voila।




Related