পাইথন ৩.৩+ এর প্যাকেজগুলির জন্য __init__.py দরকার নেই?


193

আমি পাইথন 3.5.5 ব্যবহার করছি। আমি এখানে দস্তাবেজ এবং প্যাকেজ বিভাগটি পড়েছি: https://docs.python.org/3/tutorial/modules.html# প্যাক

এখন, আমি নিম্নলিখিত কাঠামো আছে:

/home/wujek/Playground/a/b/module.py

module.py:

class Foo:
    def __init__(self):
        print('initializing Foo')

এখন, এর মধ্যে /home/wujek/Playground:

~/Playground $ python3
>>> import a.b.module
>>> a.b.module.Foo()
initializing Foo
<a.b.module.Foo object at 0x100a8f0b8>

একইভাবে, এখন বাড়িতে, এর সুপারফোল্ডার Playground:

~ $ PYTHONPATH=Playground python3
>>> import a.b.module
>>> a.b.module.Foo()
initializing Foo
<a.b.module.Foo object at 0x10a5fee10>

আসলে, আমি সব ধরণের জিনিস করতে পারি:

~ $ PYTHONPATH=Playground python3
>>> import a
>>> import a.b
>>> import Playground.a.b

কেন এই কাজ করে? আমি যদিও সেখানে হতে প্রয়োজন __init__.pyফাইল (ফাঁকা বেশী কাজ করবে) উভয় aএবং bজন্য module.pyআমদানিযোগ্য হতে কখন পাইথন পাথ পয়েন্ট Playgroundফোল্ডারের?

পাইথন ২.7 থেকে এটি পরিবর্তিত হয়েছে বলে মনে হচ্ছে:

~ $ PYTHONPATH=Playground python
>>> import a
ImportError: No module named a
>>> import a.b
ImportError: No module named a.b
>>> import a.b.module
ImportError: No module named a.b.module

সঙ্গে __init__.pyউভয় ~/Playground/aএবং ~/Playground/a/bএটা কাজ করে জরিমানা।

উত্তর:


191

পাইথন ৩.৩+ এর অন্তর্নিহিত নেমস্পেস প্যাকেজ রয়েছে যা এটি __init__.pyফাইল ছাড়াই প্যাকেজ তৈরি করতে দেয় ।

অন্তর্নিহিত নেমস্পেস প্যাকেজগুলির অনুমতি দেওয়ার অর্থ একটি __init__.pyফাইল সরবরাহ করার প্রয়োজনীয়তা সম্পূর্ণরূপে বাদ দেওয়া যায় এবং প্রভাবিত হয় ...।

__init__.pyফাইলগুলির সাথে পুরানো উপায়টি পাইথন 2-তে এখনও কাজ করে।


10
আমি নথিটি পড়ব, তবে এটি বেশ দীর্ঘ long দ্রুত সংক্ষেপে বলা কি সম্ভব? আপনি শুধু আমাকে বলুন যায়নি: এটি এখনও অবলম্বন পাওয়া Init .py বা সম্পূর্ণভাবে তাদের উপেক্ষা করে? যদি এটি তাদের সমর্থন করে তবে কার্যকারিতার মধ্যে পার্থক্য কী এবং কেন এই দ্বৈততা?
ওয়াজেক

3
সুতরাং টিউটোরিয়াল সম্ভবত আপডেট করা উচিত। একটি ডকুমেন্টেশন বাগ এর জন্য খোলা আছে?
মিশেল সামিয়া

4
আমি এখনও বিপর্যস্ত করছি যে এই উপেক্ষা করে Zen Of Python লাইন 2: Explicit is better than implicit.....
JayRizzo

4
@ জয়রিজ্জো তবে: "যদিও বাস্তবতাই বিশুদ্ধতা বজায় রাখে।"
মাইক মোলার

18
@ জয়রিজ্জা আইএমও এটি আরও স্পষ্ট। কখনও কখনও এটি init স্টাফগুলি করতে ঘটে __init__.py, কখনও কখনও না। পাইথন 3 এ যখন আমার এই জিনিসগুলির প্রয়োজন হয় আমি __init__.pyনির্দিষ্ট কোড সহ একটি নতুন তৈরি করি , অন্যথায় আমি তা করি না। দৃশ্যমানভাবে, কোন প্যাকেজগুলিতে কাস্টম ইআরআই রয়েছে তা জানার এটি সহজ হয়। অজগর 2 এর পরিবর্তে আমাকে সর্বদা একটি __init__.py(প্রায়শই শূন্য) রাখতে হবে, এগুলির একটি বিশাল সংখ্যা তৈরি করে এবং অবশেষে আপনি আপনার আর ডি কোডটি কোথায় রেখেছিলেন তা মনে রাখা আরও কঠিন। এটিও "একটি হওয়া উচিত - এবং সম্ভবত এটি করার একমাত্র উপায় fit"
পাওলো

146

গুরুত্বপূর্ণ

@ মাইকের উত্তর সঠিক তবে খুব অসম্পূর্ণ। এটি সত্য যে পাইথন ৩.৩+ ইম্পিটেড নেমস্পেস প্যাকেজগুলিকে সমর্থন করে যা এটি __init__.pyফাইল ছাড়াই প্যাকেজ তৈরি করতে দেয় ।

তবে এটি কেবলমাত্র EMPTY__init__.py ফাইলগুলিতে প্রযোজ্য । সুতরাং EMPTY__init__.py ফাইলগুলি আর প্রয়োজন হয় না এবং বাদ দেওয়া যায়। আপনি যদি প্যাকেজ বা এর কোনও মডিউল বা সাব-প্যাকেজ আমদানি করা হয় তখন আপনি কোনও নির্দিষ্ট সূচনা স্ক্রিপ্টটি চালাতে চান তবে আপনার এখনও একটি __init__.pyফাইল প্রয়োজন । আপনি যদি ভাবছেন যে কেন এটি কোনওভাবেই কার্যকর হয় তবে আপনি কেন আরও কিছু শুরু করার জন্য কোনও ফাইল ব্যবহার করতে চান তার জন্য এটি দুর্দান্ত স্ট্যাক ওভারফ্লো উত্তর__init__.py

ডিরেক্টরি কাঠামোর উদাহরণ:

  parent_package/
     __init__.py            <- EMPTY, NOT NECESSARY in Python 3.3+
     child_package/
          __init__.py       <- STILL REQUIRED if you want to run an initialization script
          child1.py
          child2.py
          child3.py

parent_package/child_package/__init__.py:

print("from parent")

উদাহরণ

নীচের উদাহরণগুলি দেখায় যে এর যখন কোনও child_packageবা একটি মডিউল আমদানি করা হয় তখন কীভাবে সূচনা স্ক্রিপ্ট কার্যকর করা হয়।

উদাহরণ 1 :

from parent_package import child_package  # prints "from parent"

উদাহরণ 2 :

from parent_package.child_package import child1  # prints "from parent"

2
ধরুন আমি run_script.pyএকই Dir হিসেবে parent_packageতাই আমি ঠিক মত আমদানি করতে পারেন from parent_package.child_package import child1ছাড়া __init__.py?
mrgloom

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

হ্যাঁ, আমি তোমাকে কেন করতে হবে না child1.py, child2.pyশুধু তাদের কোড একসঙ্গে মধ্যে নির্বাণ পরিবর্তে __init__.py সরাসরি।
বিনকি

আমদানি বিবৃতিগুলি __init__কি আপেক্ষিক আমদানি হওয়া উচিত নয় from . import child1? পরম আমদানি আমাকে দেয় ModuleNotFoundError(পাইথন ৩.6 এ)
হ্যালবার্ড

5
আমার অভিজ্ঞতায় এমনকি পাইথন ৩.৩++ এর মধ্যেও __init__.pyমাঝে মাঝে খালি দরকার হয় যেমন আপনি যখন সাবফোল্ডারটিকে প্যাকেজ হিসাবে উল্লেখ করতে চান তখন। উদাহরণস্বরূপ, যদি আমি চালনা python -m test.fooকরি __init__.pyতবে টেস্ট ফোল্ডারের নীচে খালি তৈরি না করা পর্যন্ত এটি কাজ করে না । এবং আমি এখানে 3.6.6 সংস্করণ সম্পর্কে কথা বলছি!
প্রহ্লাদ ইয়েরি

6

আপনি যদি setup.pyআপনার প্রকল্পের মধ্যে আপনার ব্যবহৃত ওয়েবসাইট ও find_packages()এটি মধ্যে, এটি একটি আছে প্রয়োজনীয় __init__.pyপ্যাকেজের জন্য স্বয়ংক্রিয়ভাবে পাওয়া যাবে যে ডিরেক্টরির মধ্যে ফাইল।

প্যাকেজগুলি কেবল তখনই স্বীকৃত হয় যখন সেগুলিতে কোনও __init__.pyফাইল অন্তর্ভুক্ত থাকে

ইউপিডি : আপনি যদি অন্তর্ভুক্ত নেমস্পেস প্যাকেজগুলি ব্যবহার করতে চান তবে __init__.pyকেবল তার find_namespace_packages()পরিবর্তে ব্যবহার করতে হবে

ডক্স


1

আমি বলব যে কেউ __init__.pyযদি অন্তর্নিহিত নেমস্পেস প্যাকেজ পেতে চায় তবে কেবল তারই বাদ দেওয়া উচিত । এর অর্থ কী তা আপনি যদি না জানেন তবে আপনি সম্ভবত এটি চান না এবং তাই __init__.pyপাইথন 3- তে আপনার ব্যবহার অবিরত করা উচিত ।

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