টি এল; ডিআর:
পাইথন ৩.৩-এ আপনাকে কিছু করতে হবে না, কেবল __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__)
অন্তর্নিহিত নেমস্পেস প্যাকেজ অন্তর্ভুক্ত করার জন্য আপডেট করা হয়নি।