টি এল; ডিআর:
পাইথন ৩.৩-এ আপনাকে কিছু করতে হবে না, কেবল __init__.pyনিজের নাম স্থান প্যাকেজ ডিরেক্টরিতে কোনও রাখবেন না এবং এটি কেবল কাজ করবে। প্রাক -৩.৩-এ, pkgutil.extend_path()সমাধানটি সমাধান করুন pkg_resources.declare_namespace(), কারণ এটি ভবিষ্যত-প্রমাণ এবং ইতিমধ্যে অন্তর্ভুক্ত নেমস্পেস প্যাকেজগুলির সাথে সামঞ্জস্যপূর্ণ।
পাইথন ৩.৩ বিভক্ত নেমস্পেস প্যাকেজগুলি উপস্থাপন করে, পিইপি 420 দেখুন ।
এর অর্থ এখন তিন ধরণের অবজেক্ট রয়েছে যা একটি দ্বারা তৈরি করা যেতে পারে import foo:
- একটি
foo.pyফাইল দ্বারা প্রতিনিধিত্ব করা একটি মডিউল
- একটি নিয়মিত প্যাকেজ,
fooএকটি __init__.pyফাইল ধারণকারী ডিরেক্টরি দ্বারা প্রতিনিধিত্ব করা
fooকোনও __init__.pyফাইল ছাড়াই এক বা একাধিক ডিরেক্টরি দ্বারা প্রতিনিধিত্ব করা একটি নেমস্পেস প্যাকেজ
প্যাকেজগুলি মডিউলগুলিও, তবে এখানে আমি "মডিউল" বলার সময় "নন-প্যাকেজ মডিউল" বোঝায়।
প্রথমে এটি sys.pathএকটি মডিউল বা নিয়মিত প্যাকেজটির জন্য স্ক্যান করে । যদি এটি সফল হয়, এটি অনুসন্ধান বন্ধ করে মডিউল বা প্যাকেজটি তৈরি করে এবং ইনটাইটেলাইজ করে। যদি এটির কোনও মডিউল বা নিয়মিত প্যাকেজ না পাওয়া যায় তবে এটি কমপক্ষে একটি ডিরেক্টরি খুঁজে পাওয়া যায়, এটি একটি নেমস্পেস প্যাকেজ তৈরি করে এবং আরম্ভ করে।
মডিউল এবং নিয়মিত প্যাকেজগুলি সেগুলি থেকে তৈরি করা ফাইলে __file__সেট হয়ে .pyগেছে। নিয়মিত এবং নেমস্পেস প্যাকেজগুলি __path__সেগুলি তৈরি করা ডিরেক্টরি বা ডিরেক্টরিতে সেট করে।
আপনি যখন তা করবেন import foo.bar, উপরোক্ত অনুসন্ধানের জন্য প্রথম ঘটে foo, তারপর যদি একটি প্যাকেজ পাওয়া যায় নি, জন্য অনুসন্ধান barসঙ্গে সম্পন্ন করা হয় foo.__path__সার্চ পরিবর্তে পাথ হিসাবে sys.path। যদি foo.barপাওয়া যায়, fooএবং foo.barতৈরি করা হয় এবং আরম্ভ করা হয়।
তাহলে কীভাবে নিয়মিত প্যাকেজ এবং নেমস্পেস প্যাকেজগুলি মিশ্রিত হয়? সাধারণত এগুলি হয় না, তবে pkgutilঅন্তর্নিহিত নেমস্পেস প্যাকেজগুলি অন্তর্ভুক্ত করার জন্য পুরাতন স্পষ্টর নাম স্পেস প্যাকেজ পদ্ধতিটি বাড়ানো হয়েছে।
আপনার যদি কোনও বিদ্যমান নিয়মিত প্যাকেজ থাকে যা এর __init__.pyমতো থাকে:
from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)
... উত্তরাধিকার আচরণটি অনুসন্ধানের পথে অন্য কোনও নিয়মিত প্যাকেজ যুক্ত করা __path__। তবে পাইথন ৩.৩-তে এটি নামস্থান প্যাকেজ যুক্ত করে।
সুতরাং আপনার নিম্নলিখিত ডিরেক্টরি কাঠামো থাকতে পারে:
├── path1
│ └── package
│ ├── __init__.py
│ └── foo.py
├── path2
│ └── package
│ └── bar.py
└── path3
└── package
├── __init__.py
└── baz.py
... আর যতদিন দুই __init__.pyআছে extend_pathলাইন (এবং path1, path2এবং path3আপনার মধ্যে আছে sys.path) import package.foo, import package.barএবং import package.bazসব কাজ করবে।
pkg_resources.declare_namespace(__name__) অন্তর্নিহিত নেমস্পেস প্যাকেজ অন্তর্ভুক্ত করার জন্য আপডেট করা হয়নি।