python - __Init__.py এর জন্য কি?



5 Answers

__init__.py নামের ফাইলগুলি Python প্যাকেজ ডিরেক্টরি হিসাবে ডিস্কে ডিরেক্টরি চিহ্নিত করতে ব্যবহৃত হয়। আপনি ফাইল আছে

mydir/spam/__init__.py
mydir/spam/module.py

এবং mydir আপনার পথে mydir , আপনি module.py এ কোডটি আমদানি করতে পারেন

import spam.module

অথবা

from spam import module

__init__.py ফাইলটি মুছে __init__.py , পাইথন আর সেই ডিরেক্টরির মধ্যে submodules সন্ধান করবে না, তাই মডিউল আমদানি করার প্রচেষ্টা ব্যর্থ হবে।

__init__.py ফাইল সাধারণত খালি থাকে, তবে প্যাকেজের নির্বাচিত অংশগুলি আরও সুবিধাজনক নামের অধীনে, সুবিধার ফাংশন ধরে রাখতে, ইত্যাদির জন্য ব্যবহার করা যেতে পারে। উপরে উল্লিখিত উদাহরণটি, init মডিউলের সামগ্রীগুলি অ্যাক্সেস করা যেতে পারে

import spam

this উপর ভিত্তি করে

python module

পাইথন উৎস ডিরেক্টরির মধ্যে __init__.py কী?




__init__.py এর 2 টি প্রধান কারণ __init__.py

  1. সুবিধার জন্য: অন্যান্য ব্যবহারকারীদের আপনার ফাংশন অনুক্রমের মধ্যে আপনার ফাংশন সঠিক অবস্থান জানতে হবে না।

    your_package/
      __init__.py
      file1.py/
      file2.py/
        ...
      fileN.py
    
    # in __init__.py
    from file1 import *
    from file2 import *
    ...
    from fileN import *
    
    # in file1.py
    def add():
        pass

    তারপর অন্যদের দ্বারা () কল করতে পারেন

    from your_package import add

    ফাইল 1, বুদ্ধিমান ছাড়া

    from your_package.file1 import add
  2. আপনি যদি কিছু শুরু করতে চান; উদাহরণস্বরূপ, লগিং (যা উপরের স্তরের মধ্যে রাখা উচিত):

    import logging.config
    logging.config.dictConfig(Your_logging_config)



Python 3.3 থেকে, __init__.py ডিরেক্টরিগুলিকে আমদানিযোগ্য পাইথন প্যাকেজ হিসাবে সংজ্ঞায়িত করার প্রয়োজন নেই।

PEP 420 চেক করুন : কার্যকর নামস্থান প্যাকেজগুলি :

প্যাকেজ ডিরেক্টরিগুলির জন্য নেটিভ সমর্থন যা __init__.py মার্কার ফাইলগুলির প্রয়োজন হয় না এবং স্বয়ংক্রিয়ভাবে একাধিক পাথ অংশগুলি বিস্তার করতে পারে (নামস্থান প্যাকেজগুলিতে বিভিন্ন তৃতীয় পক্ষের পন্থা দ্বারা অনুপ্রাণিত, PEP 420 এ বর্ণিত)

এখানে পরীক্ষা:

$ mkdir -p /tmp/test_init
$ touch /tmp/test_init/module.py /tmp/test_init/__init__.py
$ tree -at /tmp/test_init
/tmp/test_init
├── module.py
└── __init__.py
$ python3

>>> import sys
>>> sys.path.insert(0, '/tmp')
>>> from test_init import module
>>> import test_init.module

$ rm -f /tmp/test_init/__init__.py
$ tree -at /tmp/test_init
/tmp/test_init
└── module.py
$ python3

>>> import sys
>>> sys.path.insert(0, '/tmp')
>>> from test_init import module
>>> import test_init.module

রেফারেন্স:
https://docs.python.org/3/whatsnew/3.3.html#pep-420-implicit-namespace-packages
https://www.python.org/dev/peps/pep-0420/
পাইথন 3 এর প্যাকেজগুলির জন্য __init__.py প্রয়োজন নেই?




__init__.py একটি লোডযোগ্য মডিউল হিসাবে এটির ডিরেক্টরিটি ব্যবহার করবে।

যারা কোড পড়া পছন্দ করে তাদের জন্য, আমি এখানে দুই-বিট অ্যালকিমস্টের মন্তব্য লিখি ।

$ find /tmp/mydir/
/tmp/mydir/
/tmp/mydir//spam
/tmp/mydir//spam/__init__.py
/tmp/mydir//spam/module.py
$ cd ~
$ python
>>> import sys
>>> sys.path.insert(0, '/tmp/mydir')
>>> from spam import module
>>> module.myfun(3)
9
>>> exit()
$ 
$ rm /tmp/mydir/spam/__init__.py*
$ 
$ python
>>> import sys
>>> sys.path.insert(0, '/tmp/mydir')
>>> from spam import module
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named spam
>>> 



পাইথন __init__.py ফাইল ছাড়া কাজ করে তবে আপনাকে এখনও একটি অন্তর্ভুক্ত করতে হবে।

এটি একটি প্যাকেজটিকে মডিউল হিসাবে বিবেচনা করা উচিত তা নির্দিষ্ট করে, তাই এটি অন্তর্ভুক্ত করুন (এমনকি এটি খালি থাকলেও)।

এমন __init__.py ঘটনা রয়েছে যেখানে আপনি প্রকৃতপক্ষে __init__.py ফাইলটি ব্যবহার করতে পারেন:

আপনি নিম্নলিখিত ফাইলের গঠন ছিল কল্পনা করুন:

main_methods 
    |- methods.py

এবং methods.py এই অন্তর্ভুক্ত:

def foo():
    return 'foo'

foo() ব্যবহার করার জন্য আপনাকে নিম্নলিখিতগুলির মধ্যে একটি প্রয়োজন হবে:

from main_methods.methods import foo # Call with foo()
from main_methods import methods # Call with methods.foo()
import main_methods.methods # Call with main_methods.methods.foo()

হয়তো আপনি (অথবা চান) main_methods (উদাহরণস্বরূপ রানটাইম / নির্ভরতা) main_methods methods.py রাখা প্রয়োজন কিন্তু আপনি শুধুমাত্র main_methods আমদানি করতে চান।

যদি আপনি methods.py থেকে __init__.py নামটি পরিবর্তন করেন তবে আপনি কেবলমাত্র main_methods আমদানি করে foo() ব্যবহার করতে পারেন:

import main_methods
print(main_methods.foo()) # Prints 'foo'

এটি কাজ করে কারণ __init__.py প্যাকেজের অংশ হিসাবে গণ্য করা হয়।

কিছু পাইথন প্যাকেজ আসলে এই কাজ। JSON সাথে একটি উদাহরণ রয়েছে, যেখানে চলমান import json __init__.py আসলে json প্যাকেজ থেকে __init__.py আমদানি করছে ( এখানে প্যাকেজ ফাইল গঠনটি দেখুন ):

উত্স কোড: Lib/json/__init__.py






Related