python - সহজ ভাষায় পাইথন ৩ pdf




পাইথন মধ্যে বিজ্ঞপ্তি(বা চক্রবর্তী) আমদানি (8)

অন্যান্য উত্তর যেমন এই প্যাটার্ন পাইথন গ্রহণযোগ্য বর্ণনা:

def dostuff(self):
     from foo import bar
     ...

ফাইলটি অন্যান্য মডিউল দ্বারা আমদানি করা হয় যখন আমদানি বিবৃতি নির্বাহ এড়াতে হবে। শুধুমাত্র যদি একটি যৌক্তিক বৃত্ত নির্ভরতা থাকে, এটি ব্যর্থ হবে।

বেশিরভাগ সার্কুলার আমদানিগুলি আসলে লজিক্যাল সার্কুলার আমদানি নয় বরং আমদানি-ত্রুটি ত্রুটিগুলি বাড়াতে পারে, কারণ import() যখন বলা হয় তখন সমগ্র ফাইলের শীর্ষ স্তরের বিবৃতিগুলি মূল্যায়ন করে।

যদি আপনি ইতিবাচকভাবে আপনার আমদানিগুলি উপরের দিকে চান তবে এই ImportErrors প্রায়শই এড়িয়ে যেতে পারে :

এই বৃত্তাকার আমদানি বিবেচনা করুন:

অ্যাপ এ

# profiles/serializers.py

from images.serializers import SimplifiedImageSerializer

class SimplifiedProfileSerializer(serializers.Serializer):
    name = serializers.CharField()

class ProfileSerializer(SimplifiedProfileSerializer):
    recent_images = SimplifiedImageSerializer(many=True)

অ্যাপ বি

# images/serializers.py

from profiles.serializers import SimplifiedProfileSerializer

class SimplifiedImageSerializer(serializers.Serializer):
    title = serializers.CharField()

class ImageSerializer(SimplifiedImageSerializer):
    profile = SimplifiedProfileSerializer()

ডেভিড Beazleys চমৎকার আলাপ মডিউল এবং প্যাকেজ থেকে: লাইভ এবং মরুন ! - পাইকন 2015 , 1:54:00 , এখানে পাইথনের বৃত্তাকার আমদানি মোকাবেলা করার উপায় রয়েছে:

try:
    from images.serializers import SimplifiedImageSerializer
except ImportError:
    import sys
    SimplifiedImageSerializer = sys.modules[__package__ + '.SimplifiedImageSerializer']

এটি SimplifiedImageSerializer ImportError আমদানি করার চেষ্টা করে এবং যদি আমদানি- ImportError উত্থাপিত হয়, কারণ ইতিমধ্যে এটি আমদানি করা হয় তবে এটি আমদানিক্যাচ থেকে এটি টেনে আনবে।

পিএসঃ ডেভিড বিজলি এর কণ্ঠে আপনাকে এই পুরো পোস্টটি পড়তে হবে।

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

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


আমি এখানে Pythoneer এর উত্তর সঙ্গে সম্পূর্ণ একমত। কিন্তু আমি কয়েকটি কোডের উপর হতাশ হয়ে পড়েছি যা বৃত্তাকার আমদানিগুলির সাথে ত্রুটিযুক্ত ছিল এবং ইউনিট পরীক্ষা যোগ করার সময় সমস্যা সৃষ্টি করে। সুতরাং সবকিছু পরিবর্তন না করে দ্রুত প্যাচ করতে আপনি একটি গতিশীল আমদানি করে সমস্যা সমাধান করতে পারেন।

# Hack to import something without circular import issue
def load_module(name):
    """Load module using imp.find_module"""
    names = name.split(".")
    path = None
    for name in names:
        f, path, info = imp.find_module(name, path)
        path = [path]
    return imp.load_module(name, f, path[0], info)
constants = load_module("app.constants")

আবার, এটি স্থায়ী সমাধান নয় তবে কোডটি খুব বেশি পরিবর্তন না করে আমদানি আমদানিটি ঠিক করতে চায় এমন কাউকে সহায়তা করতে পারে।

চিয়ার্স!


আমি নিম্নোক্ত সমস্যার সমাধান করেছি, এবং এটি কোন ত্রুটি ছাড়াই ভাল কাজ করে। দুটি ফাইল বিবেচনা করুন 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

এটি অন্য সমাধান হতে পারে, আমার জন্য কাজ করে।

def MandrillEmailOrderSerializer():
from sastaticketpk.apps.flights.api.v1.serializers import MandrillEmailOrderSerializer
return MandrillEmailOrderSerializer

email_data = MandrillEmailOrderSerializer()(order.booking).data

চকচকে আমদানি বন্ধ, কিন্তু আপনি সতর্কতা অবলম্বন করা আবশ্যক মডিউল প্রারম্ভকালে 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 হওয়ার পরেই ঘটবে।


ঠিক আছে, আমি মনে করি আমার একটি সুন্দর শীতল সমাধান আছে। চলুন আপনি 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।


মডিউল a.py:

import b
print("This is from module a")

মডিউল b.py

import a
print("This is from module b")

চলমান "মডিউল একটি" আউটপুট হবে:

>>> 
'This is from module a'
'This is from module b'
'This is from module a'
>>> 

বৃত্তাকার আমদানি করার কারণে এটি ইনফিনিটিভাল আউটপুট করার সময় এটি এই 3 লাইন আউটপুট। "মডিউল এ" চালানোর সময় লাইন দ্বারা লাইন কী হয় তা এখানে তালিকাভুক্ত করা হয়:

  1. প্রথম লাইন import b । তাই এটি মডিউল ঘ পরিদর্শন করবে
  2. মডিউল বি প্রথম লাইন import a । তাই এটি একটি মডিউল পরিদর্শন করবে
  3. মডিউলটিতে প্রথম লাইনটি import b তবে মনে রাখবেন যে এই লাইনটি আবার আর কার্যকর হবে না , কারণ পাইথনটিতে প্রতিটি ফাইল একবারে একটি আমদানি লাইন চালায়, এটি কোনও স্থানে বা কোথায় কার্যকর হয় তা গুরুত্বপূর্ণ নয়। তাই এটি পরবর্তী লাইনটি পাস করবে এবং "This is from module a" মুদ্রণ করবে।
  4. সম্পূর্ণ মডিউল পরিদর্শন শেষে মডিউল বি থেকে একটি, আমরা এখনও মডিউল বি এ। তাই পরবর্তী লাইন মুদ্রণ করা হবে "This is from module b"
  5. মডিউল বি লাইন সম্পূর্ণরূপে মৃত্যুদন্ড কার্যকর করা হয়। তাই আমরা মডিউল ফিরে যেতে হবে যেখানে আমরা মডিউল খ শুরু।
  6. আমদানি বি লাইন ইতিমধ্যে মৃত্যুদন্ড কার্যকর করা হয়েছে এবং আবার মৃত্যুদন্ড কার্যকর করা হবে না। পরবর্তী লাইনটি "This is from module a" মুদ্রণ করবে এবং প্রোগ্রামটি শেষ হবে।

আপনি যদি import bar ভিতরে foo import bar এবং foo import bar এটি সূক্ষ্ম কাজ করবে। আসলে যে কোনও সময় রান করে, উভয় মডিউল সম্পূর্ণরূপে লোড হবে এবং একে অপরের রেফারেন্স থাকবে।

সমস্যাটি হল যখন আপনি from foo import abc from bar import xyz এবং from bar import xyz । কারন এখন প্রতিটি মডিউলের জন্য অন্য মডিউলটি ইতিমধ্যে আমদানি করা দরকার (যাতে আমরা যে নামটি আমদানি করছি তা আমদানি করার আগে) এটি আমদানি করা যাবে।





cyclic-reference