পাইথন বৃত্তাকার আমদানি?


102

সুতরাং আমি এই ত্রুটি পেয়েছি

Traceback (most recent call last):
  File "/Users/alex/dev/runswift/utils/sim2014/simulator.py", line 3, in <module>
    from world import World
  File "/Users/alex/dev/runswift/utils/sim2014/world.py", line 2, in <module>
    from entities.field import Field
  File "/Users/alex/dev/runswift/utils/sim2014/entities/field.py", line 2, in <module>
    from entities.goal import Goal
  File "/Users/alex/dev/runswift/utils/sim2014/entities/goal.py", line 2, in <module>
    from entities.post import Post
  File "/Users/alex/dev/runswift/utils/sim2014/entities/post.py", line 4, in <module>
    from physics import PostBody
  File "/Users/alex/dev/runswift/utils/sim2014/physics.py", line 21, in <module>
    from entities.post import Post
ImportError: cannot import name Post

এবং আপনি দেখতে পাচ্ছেন যে আমি একই আমদানির বিবৃতিটি আরও উপরে ব্যবহার করি এবং এটি কাজ করে? বিজ্ঞপ্তি আমদানি সম্পর্কে কিছু অলিখিত নিয়ম আছে? কল স্ট্যাকের নিচে আমি কীভাবে একই ক্লাসটি ব্যবহার করব?

উত্তর:


167

আমি মনে করি jpmc26 এর উত্তর, কোনওভাবেই ভুল না হলেও বিজ্ঞপ্তি আমদানিতে খুব বেশি নেমে আসে। আপনি যদি তাদের সঠিকভাবে সেট আপ করেন তবে তারা ঠিক কাজ করতে পারে।

এর চেয়ে সহজ উপায় হ'ল import my_moduleসিনট্যাক্স ব্যবহার করা from my_module import some_object। পূর্ববর্তী প্রায় সর্বদা কাজ করবে, এমনকি my_moduleঅন্তর্ভুক্ত থাকলে আমদানি করে আমদানি করা। পরেরটি কেবল তখনই কাজ করে যদি my_objectইতিমধ্যে সংজ্ঞায়িত করা হয় my_module, যা একটি বিজ্ঞপ্তি আমদানির ক্ষেত্রে নাও হতে পারে।

আপনার ক্ষেত্রে সুনির্দিষ্ট হতে: entities/post.pyকরতে পরিবর্তন করার চেষ্টা করুন import physicsএবং তারপরে physics.PostBodyকেবল PostBodyসরাসরি না থেকে বরং উল্লেখ করুন । একইভাবে, করতে পরিবর্তন physics.pyকরুন import entities.postএবং তারপরে ন্যায়বিচারের entities.post.Postচেয়ে ব্যবহার করুন Post


5
এই উত্তরটি কি আপেক্ষিক আমদানির সাথে সামঞ্জস্যপূর্ণ?
জো

19
কেন এমন হয়?
জুয়ান পাবলো

5
এটা বলা ভুল যে অ- fromসিনট্যাক্স সবসময় কাজ করবে। আমার class A(object): pass; class C(b.B): passযদি মডিউল ক এবং class B(a.A): passমডিউল বিতে থাকে তবে বিজ্ঞপ্তি আমদানি এখনও একটি সমস্যা এবং এটি কাজ করবে না।
CrazyCasta

4
আপনি ঠিক বলেছেন, মডিউলগুলির শীর্ষ স্তরের কোডের কোনও বিজ্ঞপ্তি নির্ভরতা (যেমন আপনার উদাহরণে শ্রেণীর ঘোষণার বেস শ্রেণি) সমস্যা হবে। এটি এমন এক ধরণের পরিস্থিতি যেখানে জেএমপিসির উত্তর যে আপনার মডিউল সংস্থার রিফ্যাক্টর করা উচিত সম্ভবত 100% সঠিক। হয় ক্লাসটি Bমডিউলে aসরান, বা শ্রেণিটিকে Cমডিউলে সরান bযাতে আপনি চক্রটি ভেঙে দিতে পারেন। এটি আরও লক্ষণীয় যে, বৃত্তের কেবলমাত্র একটি দিকের শীর্ষ স্তরের কোড জড়িত থাকলেও (উদাহরণস্বরূপ শ্রেণিটি Cউপস্থিত না থাকলে), কোনও কোডটি প্রথমে অন্য কোড দ্বারা আমদানি করা হয়েছে তার উপর নির্ভর করে আপনি একটি ত্রুটি পেতে পারেন
ব্ল্যাককিংহিট

4
@ টাইলারক্রম্পটন: "মডিউল আমদানি অবশ্যই নিখুঁত হতে হবে" দ্বারা আপনি কী বোঝাতে চাইছেন তা আমি নিশ্চিত নই। বিজ্ঞপ্তি সংক্রান্ত আপেক্ষিক আমদানিগুলি যতক্ষণ না আপনি মডিউলগুলি আমদানি করতে পারবেন ততক্ষণ তাদের সামগ্রীগুলি (যেমন from . import sibling_module, নয় from .sibling_module import SomeClass) কাজ করতে পারে। যখন প্যাকেজের __init__.pyফাইলটি বৃত্তাকার আমদানিতে জড়িত থাকে তখন আরও কিছু সূক্ষ্মতা থাকে , তবে বিষয়টি উভয়ই বিরল এবং সম্ভবত importবাস্তবায়নে একটি বাগ রয়েছে । দেখুন পাইথন বাগ 23447 , যা আমি একটি প্যাচ পেশ (যা হায়রে নিস্তেজ হয়েছে)।
ব্ল্যাকঙ্কহট

51

আপনি যখন প্রথমবারের জন্য কোনও মডিউল (বা এর সদস্য) আমদানি করেন, মডিউলটির অভ্যন্তর কোডটি অন্য কোনও কোডের মতো ক্রমানুসারে কার্যকর করা হয়; উদাহরণস্বরূপ, এটি কোনও আলাদাভাবে আচরণ করা হয় না যে কোনও ফাংশনের মূল অংশ। একটি importহ'ল অন্য কোনও (অ্যাসাইনমেন্ট, একটি ফাংশন কল def, class) এর মতো একটি কমান্ড । আপনার আমদানি স্ক্রিপ্টের শীর্ষে ঘটেছিল ধরে নেওয়া হচ্ছে, তারপরে এখানে যা ঘটছে তা এখানে:

  • আপনি যখন আমদানি করার চেষ্টা Worldকরেন world, worldস্ক্রিপ্টটি কার্যকর হয়।
  • worldস্ক্রিপ্ট আমদানির Field, যা ঘটায় entities.fieldস্ক্রিপ্ট মৃত্যুদন্ড কার্যকর পেতে।
  • আপনি entities.postস্ক্রিপ্টে না পৌঁছা পর্যন্ত এই প্রক্রিয়াটি অব্যাহত থাকে কারণ আপনি আমদানির চেষ্টা করেছিলেনPost
  • entities.postস্ক্রিপ্ট কারণ physicsকারণ এটি আমদানি করার চেষ্টা করে মডিউল নিষ্পন্ন করা হবেPostBody
  • অবশেষে, physicsআমদানি করার চেষ্টা করে Postথেকেentities.post
  • entities.postমডিউলটি এখনও মেমরির মধ্যে রয়েছে কিনা তা সম্পর্কে আমি নিশ্চিত নই , তবে এটি সত্যিই কিছু যায় আসে না। হয় মডিউলটি মেমরিতে নেই, বা মডিউলটির এখনও Postসদস্য নেই কারণ এটি নির্ধারণের জন্য নির্বাহ শেষ হয়নিPost
  • যেভাবেই হোক, একটি ত্রুটি ঘটে কারণ Postআমদানি করার দরকার নেই

সুতরাং না, এটি "কল স্ট্যাকটিতে আরও কাজ করছে না"। এটি ত্রুটিটি কোথায় ঘটেছে তার একটি স্ট্যাক ট্রেস, যার অর্থ এটি class Postশ্রেণিতে আমদানির চেষ্টা করে ভুল করেছে । আপনার বৃত্তাকার আমদানি ব্যবহার করা উচিত নয়। সর্বোপরি, এর নগণ্য সুবিধা রয়েছে (সাধারণত কোনও লাভ নেই) এবং এটি এর মতো সমস্যা সৃষ্টি করে। এটি কোনও বিকাশকারী এটি রক্ষণাবেক্ষণের উপর ভার চাপায়, এটি ভাঙ্গা এড়াতে তাদের ডিমের শাঁলে চলাচল করতে বাধ্য করে। আপনার মডিউল সংস্থা রিফ্যাক্টর।


4
হওয়া উচিত isinstance(userData, Post)। নির্বিশেষে, আপনার কোনও পছন্দ নেই। বিজ্ঞপ্তি আমদানি কাজ করবে না। আপনার বৃত্তাকার আমদানি হ'ল আমার কাছে কোড গন্ধ। এটির এমন কিছু কার্যকারিতা রয়েছে যা তৃতীয় মডিউলে স্থানান্তরিত হওয়া উচিত। পুরো ক্লাস দুটোই না দেখে কী বলতে পারলাম না।
jpmc26

4
@ সিপিআইএলএল কিছুক্ষণ পরে, আমার কাছে খুব হ্যাকী অপশন উপস্থিত হয়েছিল। আপনি (সময় সীমাবদ্ধতার বা কি আপনার আছে কারণে) এখন জন্য এই কাজ প্রায় পেতে পারে না, তাহলে আপনি পারে আপনার আমদানির স্থানীয়ভাবে পদ্ধতি যেখানে আপনি এটি ব্যবহার করছেন ভিতরে না। ফাংশন defনা বলা পর্যন্ত ভিতরে কোনও ফাংশন বডি কার্যকর করা হয় না, সুতরাং আপনি যখন ফাংশনটি প্রকৃতপক্ষে না ডাকেন ততক্ষণ আমদানি ঘটবে না। ততক্ষণে এসগুলির importকাজ করা উচিত যেহেতু কলগুলির আগে মডিউলগুলির মধ্যে একটি সম্পূর্ণ আমদানি করে। এটি একেবারে জঘন্য হ্যাক এবং এটি কোনও উল্লেখযোগ্য সময়ের জন্য আপনার কোড বেসে থাকা উচিত নয়।
jpmc26

15
আমি মনে করি আপনার উত্তরটি বিজ্ঞপ্তি আমদানিতে খুব শক্তভাবে নেমে এসেছে। বৃত্তাকারে আমদানি সাধারণত কাজ করে যদি আপনি কেবল import fooনা করেন from foo import Bar। এর কারণ বেশিরভাগ মডিউলগুলি কেবল স্টাফগুলি সংজ্ঞায়িত করে (ফাংশন এবং ক্লাসের মতো) যা পরে চালিত হয়। মডিউলগুলি যখন আপনি সেগুলি আমদানি করার সময় গুরুত্বপূর্ণ জিনিসগুলি করেন (যেমন কোনও স্ক্রিপ্ট দ্বারা সুরক্ষিত নয় if __name__ == "__main__") এখনও সমস্যা হতে পারে তবে এটি খুব সাধারণ নয় not
ব্ল্যাককিংহাত

6
@ ব্ল্যাককিংহিট আমি মনে করি যে আপনি যে বিজ্ঞপ্তিগত আমদানি ব্যবহার করেন সে ক্ষেত্রে অন্যান্য লোকদের তদন্ত করতে হবে এবং বিভ্রান্ত হবেন এমন অদ্ভুত সমস্যাগুলির জন্য সময় কাটাতে আপনি নিজেকে প্রস্তুত করছেন। এগুলি আপনাকে তাদের উপর দিয়ে ট্রিপ না করার বিষয়ে সাবধানতা অবলম্বন করতে সময় কাটাতে বাধ্য করে এবং এর উপরে একটি কোড গন্ধ যা আপনার ডিজাইনের রিফ্যাক্টরিংয়ের প্রয়োজন। তারা প্রযুক্তিগতভাবে সম্ভবপর কিনা সে সম্পর্কে আমি ভুল হতে পারি, তবে তাড়াতাড়ি বা পরে সমস্যা দেখা দেওয়ার জন্য এগুলি একটি ভয়ানক নকশা পছন্দ। স্পষ্টতা এবং সরলতা প্রোগ্রামিংয়ের পবিত্র গ্রিল এবং বৃত্তাকার আমদানিগুলি আমার বইতে লঙ্ঘন করে।
jpmc26

6
বিকল্পভাবে; আপনি আপনার কার্যকারিতা খুব বেশি বিভক্ত করেছেন এবং এটিই বিজ্ঞপ্তি আমদানির কারণ। আপনার যদি দুটি জিনিস থাকে যা সমস্ত সময় একে অপরের উপর নির্ভর করে ; এগুলি কেবল একটি ফাইলে রাখা ভাল be পাইথন জাভা নয়; অদ্ভুত আমদানি যুক্তি রোধ করতে একক ফাইলে কার্যকারিতা / শ্রেণি গোষ্ঠীভুক্ত করার কোনও কারণ নেই। :-)
মার্ক রিবাউ 16'15

41

বিজ্ঞপ্তি নির্ভরতা বুঝতে, আপনার মনে রাখতে হবে পাইথন মূলত একটি স্ক্রিপ্টিং ভাষা। বাইরের পদ্ধতির বিবৃতি কার্যকর করার সময় সংকলন ঘটে। আমদানি বিবৃতিগুলি পদ্ধতি কলগুলির মতোই কার্যকর করা হয় এবং সেগুলি বোঝার জন্য আপনার কাছে পদ্ধতি কলগুলির মতো তাদের সম্পর্কে চিন্তা করা উচিত।

আপনি যখন কোনও আমদানি করেন, তখন কী ঘটে তা নির্ভর করে আপনি যে ফাইলটি আমদানি করছেন তা ইতিমধ্যে মডিউল সারণীতে উপস্থিত রয়েছে কিনা depends এটি যদি করে, পাইথন বর্তমানে প্রতীক টেবিলের যা আছে তা ব্যবহার করে। যদি তা না হয়, পাইথন মডিউল ফাইলটি পড়া শুরু করে, সেখানে যা কিছু খুঁজে পায় তা সংকলন / সম্পাদন / আমদানি শুরু করে। সংকলনের সময় উল্লেখ করা সিম্বলগুলি পাওয়া গেছে বা না পাওয়া যায় তার উপর নির্ভর করে সেগুলি দেখা হয়েছে বা এখনও সংকলকটি এখনও দেখা যায়নি।

আপনার দুটি উত্স ফাইল রয়েছে তা কল্পনা করুন:

ফাইল এক্স.পি.

def X1:
    return "x1"

from Y import Y2

def X2:
    return "x2"

ফাইল Y.py

def Y1:
    return "y1"

from X import X1

def Y2:
    return "y2"

এখন ধরুন আপনি X.py ফাইলটি সংকলন করেছেন সংকলকটি X1 পদ্ধতিটি সংজ্ঞা দিয়ে শুরু হয় এবং তারপরে X.py এ আমদানি বিবৃতিতে আঘাত করে its এটি কম্পাইলারকে X.py সংকলন বিরতি দেয় এবং Y.py সংকলন শুরু করে causes এর খুব শীঘ্রই সংকলক Y.py. এ আমদানির বিবরণটিকে হিট করে যেহেতু এক্স.পি.পি ইতিমধ্যে মডিউল সারণীতে রয়েছে, পাইথন অনুরোধকৃত কোনও রেফারেন্স সন্তুষ্ট করতে বিদ্যমান অসম্পূর্ণ X.py প্রতীক টেবিলটি ব্যবহার করে। এক্স.পি.-তে আমদানি বিবরণের আগে উপস্থিত কোনও চিহ্ন এখন প্রতীক টেবিলের মধ্যে রয়েছে, তবে কোনও প্রতীক পরে নেই। যেহেতু এক্স 1 এখন আমদানির বিবরণীর আগে উপস্থিত হয়, এটি সফলভাবে আমদানি করা হয়। পাইথন তারপরে Y.py. সংকলন পুনরায় শুরু করে। এটি করার সাথে সাথে এটি Y2 সংজ্ঞায়িত করে এবং Y.py. সংকলন শেষ করে এরপরে এটি X.py এর সংকলনটি পুনরায় শুরু করে এবং Y.py প্রতীক টেবিলটিতে Y2 সন্ধান করে। সংকলন শেষ পর্যন্ত ডাব্লু / ও ত্রুটি সম্পূর্ণ করে।

যদি আপনি কমান্ড লাইন থেকে Y.py সংকলন করার চেষ্টা করেন তবে খুব আলাদা কিছু ঘটে। ওয়াই.পি. সংকলনের সময়, সংকলকটি ওয়াই 2 সংজ্ঞায়নের আগে আমদানির বিবরণটিকে হিট করে। তারপরে এটি X.py সংকলন শুরু করে। শীঘ্রই এটি X.py এ আমদানির বিবরণটিকে হিট করে যার জন্য ওয়াই 2 দরকার। তবে ওয়াই 2 অপরিবর্তিত, তাই সংকলন ব্যর্থ।

দয়া করে মনে রাখবেন যে আপনি Y1 আমদানি করতে X.py পরিবর্তন করে থাকলে, আপনি যে ফাইলটি সংকলন করেন তা নির্ধারণ করেই কম্পাইলটি সর্বদা সফল হবে। তবে আপনি যদি X2 চিহ্নটি আমদানি করতে Y.py ফাইলটি পরিবর্তন করেন তবে কোনও ফাইলই সংকলন করবে না।

মডিউল এক্স, বা এক্স দ্বারা আমদানি করা কোনও মডিউল বর্তমান মডিউলটি আমদানি করতে পারে যে কোনও সময়, ব্যবহার করবেন না:

from X import Y

যে কোনও সময় আপনি মনে করেন যে কোনও বৃত্তাকার আমদানি হতে পারে আপনার অন্য মডিউলগুলির মধ্যে ভেরিয়েবলগুলির সংকলন সময়ের উল্লেখগুলিও এড়ানো উচিত। নির্দোষ চেহারা কোড বিবেচনা করুন:

import X
z = X.Y

ধরুন মডিউল এক্স এই মডিউলটি এক্স আমদানির আগে এই মডিউলটি আমদানি করে Further তারপরে এই মডিউলটি আমদানি করার পরে ওয়াই সংজ্ঞায়িত হবে না এবং আপনি একটি সংকলন ত্রুটি পাবেন। যদি এই মডিউলটি প্রথমে Y আমদানি করে, আপনি এটিকে সাথে নিয়ে যেতে পারেন। কিন্তু যখন আপনার সহকর্মীদের মধ্যে একটি নির্দোষভাবে তৃতীয় মডিউলে সংজ্ঞার ক্রম পরিবর্তন করে, কোডটি ভেঙে যায়।

কিছু ক্ষেত্রে আপনি অন্য মডিউলগুলির দ্বারা প্রয়োজনীয় প্রতীক সংজ্ঞাগুলির নীচে আমদানির বিবৃতিটি সরিয়ে দিয়ে বিজ্ঞপ্তি নির্ভরতা সমাধান করতে পারেন। উপরের উদাহরণগুলিতে, আমদানির বিবৃতি দেওয়ার আগে সংজ্ঞাগুলি কখনই ব্যর্থ হয়। সংকলনের ক্রমের উপর নির্ভর করে আমদানি বিবরণের পরে সংজ্ঞাগুলি কখনও কখনও ব্যর্থ হয়। এমনকি আপনি কোনও ফাইলের শেষে আমদানি বিবৃতিও রাখতে পারেন, যতক্ষণ না সংকলনের সময় আমদানি করা চিহ্নগুলির কোনওটির প্রয়োজন হয় না।

নোট করুন যে কোনও মডিউলে আমদানির বিবৃতিগুলি নীচে নিয়ে যাওয়া আপনি যা করছেন তা অস্পষ্ট করে। আপনার মডিউলটির নীচের মত কিছুতে একটি মন্তব্যের সাথে এর জন্য ক্ষতিপূরণ দিন:

#import X   (actual import moved down to avoid circular dependency)

সাধারণভাবে এটি একটি খারাপ অভ্যাস, তবে কখনও কখনও এটি এড়ানো কঠিন।


4
আমি মনে করি না
পাইথনে পাইথনটিতে

6
পাইথন করে একটি কম্পাইলার আছে, এবং হয় @pkqxdd সংকলন সংকলন মাত্র সাধারণত ব্যবহারকারীর কাছ থেকে দূরে লুকানো হয়। এটি কিছুটা বিভ্রান্তিকর হতে পারে তবে পাইথনের কিছুটা অস্পষ্ট, "সংকলনের সময়" এর কোনও উল্লেখ ছাড়াই কী চলছে তার এই প্রশংসনীয় বিবরণ দেওয়া লেখকের পক্ষে কঠিন হবে।
হ্যাঁক


আমি আমার মেশিনে এটি চেষ্টা করে এগিয়ে গিয়েছিলাম এবং অন্যরকম ফলাফল পেয়েছি। রান এক্স.পি কিন্তু ত্রুটি পেয়েছে "" Y "থেকে 'Y2' নামটি আমদানি করতে পারে না"। ওয়াই.পি চালান যদিও কোনও সমস্যা নেই। আমি পাইথন ৩. 3..৫ এ আছি আপনি কি এখানে সমস্যাটি বোঝাতে সাহায্য করতে পারেন?
xuefeng হুয়াং

19

আপনারা যারা, আমার মতো, জ্যাঙ্গো থেকে এই ইস্যুতে এসেছেন তাদের জন্য আপনার জানা উচিত যে ডকগুলি একটি সমাধান সরবরাহ করে: https://docs.djangoproject.com/en/1.10/ref/models/fields/#foreignkey

"... অন্য অ্যাপ্লিকেশনটিতে সংজ্ঞায়িত মডেলগুলি উল্লেখ করতে, আপনি পুরো অ্যাপ্লিকেশন লেবেল সহ স্পষ্টভাবে একটি মডেল নির্দিষ্ট করতে পারেন example উদাহরণস্বরূপ, যদি উপরের উত্পাদনকারী মডেলটি উত্পাদন নামে পরিচিত অন্য অ্যাপ্লিকেশনটিতে সংজ্ঞায়িত করা হয় তবে আপনার ব্যবহার করতে হবে:

class Car(models.Model):
    manufacturer = models.ForeignKey(
        'production.Manufacturer',
        on_delete=models.CASCADE,
)

দুটি অ্যাপ্লিকেশনের মধ্যে বিজ্ঞপ্তি আমদানি নির্ভরতাগুলি সমাধান করার সময় এই ধরণের রেফারেন্সটি কার্যকর হতে পারে। ... "


6
আমি জানি "ধন্যবাদ" বলতে আমার মন্তব্যটি ব্যবহার করার কথা নয়, তবে এটি আমাকে কয়েক ঘন্টা ধরে জর্জরিত করে চলেছে। আপনাকে ধন্যবাদ, আপনাকে ধন্যবাদ আপনাকে ধন্যবাদ!!!
মাইকীই

আমি @ মাইকিই এর সাথে একমত আমি বেশ কয়েকটি ব্লগ এবং স্টোনওভারফ্লোগুলি পনিওআরএম দিয়ে এর প্রতিকার করার চেষ্টা করেছি। অন্যরা যেখানে বলছেন এটি খারাপ অভ্যাস, বা আপনি কেন আপনার ক্লাসগুলিকে বিজ্ঞপ্তি হিসাবে কোড করবেন, ঠিক যেখানে ওআরএম হয় সেখানে এটি ঘটে। কারণ অনেক উদাহরণ সমস্ত মডেলকে একই ফাইলে রাখে এবং আমরা সেই উদাহরণগুলি অনুসরণ করি, আমরা প্রতি ফাইল প্রতি একটি মডেল ব্যবহার না করে পাইথন সংকলন করতে ব্যর্থ হলে সমস্যাটি স্পষ্ট হয় না। তবুও, উত্তরটি খুব সহজ। মাইক যেমন উল্লেখ করেছেন, আপনাকে অনেক ধন্যবাদ।
ট্র্যাশ 80


3

আপনি যদি এই সমস্যাটিকে মোটামুটি জটিল অ্যাপ্লিকেশনটিতে চালিত করেন তবে আপনার সমস্ত আমদানি রিফেক্টর করা জটিল umbers পাইচার্ম এর জন্য একটি কুইকফিক্স প্রস্তাব করে যা আমদানিকৃত চিহ্নগুলির সমস্ত ব্যবহার স্বয়ংক্রিয়ভাবে পরিবর্তিত হবে।

এখানে চিত্র বর্ণনা লিখুন


0

আমি নিম্নলিখিত ব্যবহার করছিলাম:

from module import Foo

foo_instance = Foo()

তবে পরিত্রাণ পেতে circular referenceআমি নিম্নলিখিতগুলি করেছি এবং এটি কাজ করেছে:

import module.foo

foo_instance = foo.Foo()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.