__Init__.py এ কোড যুক্ত করা হচ্ছে


85

আমি জ্যাঙ্গোর মডেল সিস্টেমটি কীভাবে কাজ করে তা একবার দেখে নিচ্ছি এবং আমি এমন কিছু লক্ষ্য করেছি যা আমি বুঝতে পারি না।

আমি জানি যে আপনি __init__.pyবর্তমান ডিরেক্টরিটি একটি প্যাকেজ তা নির্দিষ্ট করে একটি খালি ফাইল তৈরি করেন । এবং আপনি কিছু পরিবর্তনশীল সেট করতে পারেন __init__.pyযাতে আমদানি * সঠিকভাবে কাজ করে।

তবে জ্যাঙ্গো ... আমদানি ... বিবৃতিগুলি থেকে একগুচ্ছ সংযোজন করে এবং ক্লাসগুলির একগুচ্ছ সংজ্ঞা দেয় __init__.py। কেন? এটি কি কেবল জিনিসগুলিকে অগোছালো দেখায় না? এই কোডটি প্রয়োজন এমন কোনও কারণ আছে কি __init__.py?


13
এটি আসলে জ্যাঙ্গো সম্পর্কে নয়? হ্যাঁ, আপনি এটি প্রথম জ্যাঙ্গোতে দেখেছিলেন তবে এটি খাঁটি পাইথন জিনিসের মতো মনে হয় - সম্ভবত জ্যাঙ্গো ট্যাগটি যথাযথভাবে উপযুক্ত নয়।
এস .লট

__init__.pyজাঙ্গো ১.৮ এ আমি কোনও আমদানির বিবৃতি দেখতে পাচ্ছি না । এটি কি পুরানো সংস্করণের জন্য ছিল? যদি তাই কোন সংস্করণ?
গোবি দাশু

উত্তর:


72

__init__.pyআপনি যে প্যাকেজটি (ডিরেক্টরি) এতে অন্তর্ভুক্ত করেন তা আমদানি করার সময় সমস্ত আমদানি উপলব্ধ করা হয়।

উদাহরণ:

./dir/__init__.py:

import something

./test.py:

import dir
# can now use dir.something

সম্পাদনা: উল্লেখ করতে ভুলে গেছেন, কোডটি __init__.pyপ্রথমবার আপনি সেই ডিরেক্টরি থেকে কোনও মডিউল আমদানি করেন। সুতরাং যে কোনও প্যাকেজ-স্তরের সূচনা কোডটি রাখার জন্য এটি সাধারণত ভাল জায়গা।

EDIT2: dgrant আমার উদাহরণে একটি সম্ভাব্য বিভ্রান্তির দিকে ইঙ্গিত করেছে। ইন __init__.py import somethingকোনও মডিউল আমদানি করতে পারে, প্যাকেজ থেকে প্রয়োজনীয় নয়। উদাহরণস্বরূপ, আমরা এটিকে এর সাথে প্রতিস্থাপন করতে পারি import datetime, তারপরে আমাদের শীর্ষ স্তরে এই test.pyউভয় স্নিপেটই কাজ করবে:

import dir
print dir.datetime.datetime.now()

এবং

import dir.some_module_in_dir
print dir.datetime.datetime.now()

নীচের লাইনটি হ'ল: অর্পিত সমস্ত নাম __init__.py, এটি আমদানি করা মডিউল, ফাংশন বা ক্লাস, প্যাকেজের কোনও প্যাকেজ বা প্যাকেজের কোনও মডিউল আমদানি করার পরে প্যাকেজ নেমস্পেসে স্বয়ংক্রিয়ভাবে উপলব্ধ।


ঠিক আছে, ধন্যবাদ. তবে আমি এখনও নিশ্চিত নই কেন ক্লাস যুক্ত করা ভাল ধারণা হবে কেন __init__.py আমি এই ক্লাসগুলির প্রারম্ভিককরণের কোডটি সত্যই বিবেচনা করি না (তবে আমি সম্ভবত এটি সম্পর্কে ভুল)।
এরিক

আপনি সম্ভবত প্যাকেজটির সাথে কাজ করার সময় এই ক্লাসগুলি সম্ভবত কার্যকর। তবে আমি অনুমান করতে চাই না যে তারা সেখানে থাকার কারণ, উদ্দেশ্য বা না থাকার অনেক কারণ থাকতে পারে :)
আলেকজান্ডার কোজেভনিকিকভ

13
এটি historicalতিহাসিক কারণেও হতে পারে। আপনি যখন মডিউলটিকে প্যাকেজে রূপান্তর করছেন, মডিউল.পি / মডিউল / __ init__.py সমস্ত বিদ্যমান কোড এটিকে আগের মতো ব্যবহার করতে পারে তবে এখন মডিউলে সাব-মডিউল থাকতে পারে।
asukasz

4
মডিউলগুলি পিতামাতাকে __init__.pyঅন্তর্নিহিতভাবে কার্যকর করে । মডিউলগুলি ভিতরে আমদানি করে __init__.pyআপনি চক্রীয় আমদানি তৈরি করছেন। __init__.pyসম্পূর্ণরূপে এক ধরনের আমদানি আগে মৃত্যুদন্ড কার্যকর করা হবে না। __init__.pyখালি রাখা নিরাপদ ।
আইভো দানহেলকা

এটি মন্তব্য করা গুরুত্বপূর্ণ যে এটি __init__.pyফাইলগুলির সাথে নির্দিষ্ট কোনও নয় । আপনার কাছে যদি এমন কোনও ফাইল থাকে dir/other.pyযা আপনার কাছে এমন কিছু ছিল যা from datetime import datetimeআপনি কল dir.other.datetime.now()করতেও সক্ষম হতেন বা এমনকি from dir.other import datetime
কার্লস সালা

37

এটি সত্যিই কেবল ব্যক্তিগত পছন্দ এবং এটি আপনার পাইথন মডিউলগুলির বিন্যাসের সাথে করতে হবে।

ধরা যাক আপনার কাছে একটি মডিউল আছে erikutils। দুটি উপায়ে এটি একটি মডিউল যা দরকার তা যদি হয় আপনি একটি ফাইল নামের erikutils.py আপনার এর উপর sys.pathঅথবা আপনি একটি তালিকা নামের erikutils আপনার এর উপর sys.pathএকটি খালি সঙ্গে __init__.pyএটা ভিতরে ফাইল। তারপর ধরুন আপনাকে বলা মডিউল একটি গুচ্ছ দাও fileutils, procutils, parseutilsএবং আপনাকে সেই অধীনে উপ-মডিউল হতে চান erikutils। সুতরাং আপনি fileutils.py , procutils.py , এবং parseutils.py নামে কিছু .py ফাইল তৈরি করেন :

erikutils
  __init__.py
  fileutils.py
  procutils.py
  parseutils.py

হতে পারে আপনি কয়েক ফাংশন যে শুধু নাগরিক নয় আছে fileutils, procutilsঅথবা parseutilsমডিউল। এবং আসুন আমরা আপনাকে একটি নতুন মডিউল নামে পরিচিত বলে মনে করেন না miscutils। এবং, আপনি ফাংশনটি এভাবে কল করতে সক্ষম হতে চাই:

erikutils.foo()
erikutils.bar()

না করে বরং

erikutils.miscutils.foo()
erikutils.miscutils.bar()

সুতরাং erikutilsমডিউলটি একটি ডিরেক্টরি নয়, একটি ফাইল নয়, আমাদের __init__.pyফাইলটির ভিতরে এটির কার্যকারিতা নির্ধারণ করতে হবে ।

জাঙ্গোতে, আমি সবচেয়ে ভাল উদাহরণটি ভাবতে পারি django.db.models.fields। সমস্ত জাজানো * ফিল্ড ক্লাসগুলি ডিজেঙ্গো / ডিবি / মডেল / ক্ষেত্র ডিরেক্টরিতে __init__.pyফাইলটিতে সংজ্ঞায়িত করা হয়েছে । আমি অনুমান করি তারা এগুলি করেছে কারণ তারা সমস্ত কিছুকে অনুমানীয় জ্যাঙ্গো / ডিবি / মডেল / ফিল্ডসপিপি মডেল হিসাবে ছড়িয়ে দিতে চান না , তাই তারা এটিকে কয়েকটি সাবমোডিয়ালে বিভক্ত করেছেন ( সম্পর্কিত.পি , ফাইলসপি , উদাহরণস্বরূপ) এবং তারা ক্ষেত্রের মডিউলে নিজেই তৈরি * ক্ষেত্রের সংজ্ঞা আটকে রেখেছিল (তাই, )।__init__.py


4
ডিগ্র্যান্ট, আমি যা বোঝাতে চেয়েছিলাম তা somethingবাহ্যিক মডিউল হতে পারে, dir.something কাজ করে দেবে। মন্তব্যের জন্য ধন্যবাদ, আমি আমার পোস্টটি আরও স্পষ্ট করতে সম্পাদনা করব।
আলেকজান্ডার কোজেভনিকিকভ

29

__init__.pyফাইলটি ব্যবহার করা আপনাকে অভ্যন্তরীণ প্যাকেজ কাঠামোটি বাইরে থেকে অদৃশ্য করে তুলতে দেয়। যদি অভ্যন্তরীণ কাঠামো পরিবর্তন হয় (যেমন আপনি একটি ফ্যাট মডিউলকে দুটি বিভক্ত করেন) আপনাকে কেবল __init__.pyফাইলটি সামঞ্জস্য করতে হবে, তবে প্যাকেজের উপর নির্ভর করে এমন কোড নয়। আপনি আপনার প্যাকেজটির কিছু অংশ অদৃশ্য করতে পারেন, উদাহরণস্বরূপ যদি তারা সাধারণ ব্যবহারের জন্য প্রস্তুত না হয়।

নোট করুন যে আপনি delকমান্ডটি ব্যবহার করতে পারেন , তাই একটি সাধারণ __init__.pyদেখতে দেখতে এটি দেখতে পারেন:

from somemodule import some_function1, some_function2, SomeObject

del somemodule

এখন আপনি যদি নতুনটি বিভক্ত somemoduleকরার সিদ্ধান্ত নেন তবে তা হ'ল __init__.py:

from somemodule1 import some_function1, some_function2
from somemodule2 import SomeObject

del somemodule1
del somemodule2

বাইরে থেকে প্যাকেজটি এখনও ঠিক আগের মতো দেখায়।


4
@ অ্যারলেন: মূল কথাটি হ'ল এটি জনসাধারণের API এর অংশ নয়। আপনি যদি কোনও মডিউলটির নাম পরিবর্তন করেন তবে আপনি নিশ্চিত হতে পারেন যে কোনও নির্ভরযোগ্য কোডের বিরতি নেই। এছাড়াও এটি নিশ্চিত করে যে এপিআই উপাদানগুলি কেবল একবার উপস্থিত হবে, উদাহরণস্বরূপ, যখন আত্মতদন্তটি স্বয়ংক্রিয়ভাবে এপিআই ডকুমেন্টেশন তৈরি করতে ব্যবহৃত হয়।
নিকো

4
@ অ্যারলেন: মডিউল মোছা import <pack>.somemodule1সরাসরি থেকে বাধা দেয় । আপনি কেবল এর <pack>মধ্যে সংজ্ঞায়িত বা আমদানিকৃত সামগ্রী __init__.pyএবং অ-মোছা সাবমডিউলগুলি থেকে আমদানি করতে পারেন ।
MestreLion
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.