python के लिए__init__.py क्या है?




module (8)

यह अन्य पायथन फ़ाइलों को आयात करने में सुविधा प्रदान करता है। जब आप इस फ़ाइल को अन्य पीई फाइलों वाली निर्देशिका में रखते हैं (सामान कहें), तो आप आयात सामग्री जैसे कुछ कर सकते हैं। अन्य।

root\
    stuff\
         other.py

    morestuff\
         another.py

निर्देशिका सामग्री के अंदर इस __init__.py बिना, आप अन्य.py आयात नहीं कर सके, क्योंकि पायथन को पता नहीं है कि सामान के लिए स्रोत कोड कहां है और इसे पैकेज के रूप में पहचानने में असमर्थ है।

एक पायथन स्रोत निर्देशिका में __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 फ़ाइलों को पाइथन को निर्देशिका वाले संकुल के रूप में उपयोग करने की आवश्यकता होती है; मॉड्यूल खोज पथ पर बाद में (गहरा) होने वाले वैध मॉड्यूल को अनजाने में छिपाने से string जैसे सामान्य नाम वाले निर्देशिकाओं को रोकने के लिए यह किया जाता है। सबसे सरल मामले में, __init__.py केवल एक खाली फ़ाइल हो सकती है, लेकिन यह पैकेज के लिए प्रारंभिक कोड निष्पादित कर सकती है या बाद में वर्णित __all__ चर सेट कर __all__


__init__.py नाम की फ़ाइलों को डिस्क पर निर्देशिका को पायथन पैकेज निर्देशिका के रूप में चिह्नित करने के लिए उपयोग किया जाता है। अगर आपके पास फाइलें हैं

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

और mydir आपके पथ पर है, आप module.py रूप में कोड आयात कर सकते हैं

import spam.module

या

from spam import module

यदि आप __init__.py फ़ाइल को हटाते हैं, तो पाइथन अब उस निर्देशिका के अंदर submodules की तलाश नहीं करेगा, इसलिए मॉड्यूल आयात करने का प्रयास विफल हो जाएगा।

__init__.py फ़ाइल आमतौर पर खाली होती है, लेकिन इसका उपयोग पैकेज के चयनित हिस्सों को अधिक सुविधाजनक नाम, सुविधा कार्यों को पकड़ने आदि के निर्यात के लिए किया जा सकता है। उपर्युक्त उदाहरण को देखते हुए, init मॉड्यूल की सामग्री को एक्सेस किया जा सकता है

import spam

this पर आधारित है


__init__.py लिए 2 मुख्य कारण हैं

  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)
    

चूंकि पायथन 3.3, __init__.py को निर्देशिकाओं को आयात करने योग्य पायथन पैकेज के रूप में परिभाषित करने की आवश्यकता नहीं है।

पीईपी 420 की जांच करें : लागू नामस्थान पैकेज :

पैकेज निर्देशिकाओं के लिए मूल समर्थन जो __init__.py मार्कर फ़ाइलों की आवश्यकता नहीं है और स्वचालित रूप से एकाधिक पथ खंडों ( पीईपी 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/
क्या Python 3 में संकुल के लिए __init__.py की आवश्यकता नहीं है?


__init__.py के लिए क्या उपयोग किया जाता है?

__init__.py का प्राथमिक उपयोग पायथन पैकेज प्रारंभ करना है। इसका प्रदर्शन करने का सबसे आसान तरीका मानक पायथन मॉड्यूल की संरचना को देखना है।

package/
    __init__.py
    file.py
    file2.py
    file3.py
    subpackage/
        __init__.py
        submodule1.py
        submodule2.py

जैसा कि आप निर्देशिका में __init__.py फ़ाइल को शामिल करने के ऊपर संरचना में देख सकते हैं, पाइथन दुभाषिया को इंगित करता है कि निर्देशिका को पायथन पैकेज की तरह माना जाना चाहिए

__init__.py में क्या होता है?

__init__.py एक खाली फ़ाइल हो सकती है लेकिन इसे अक्सर पैकेज के लिए आवश्यक सेटअप करने के लिए उपयोग किया जाता है (आयात चीजें, पथ में चीजें लोड करना आदि)।

आपके __init__.py में करने के लिए एक आम बात यह है कि चयनित वर्ग, फ़ंक्शन इत्यादि को पैकेज स्तर में आयात करना है ताकि उन्हें पैकेज से विश्वसनीय रूप से आयात किया जा सके।

उदाहरण के लिए हम कह सकते हैं कि file.py में क्लास फ़ाइल है। तो हमारे __init__.py में कुछ भी बिना आप इस वाक्यविन्यास के साथ आयात करेंगे:

from package.file import File

हालांकि आप पैकेज स्तर पर इसे उपलब्ध कराने के लिए फ़ाइल को अपने __init__.py में आयात कर सकते हैं:

# in your __init__.py
from file import File

# now import File from package
from package import File

करने के लिए एक और चीज पैकेज स्तर पर __all__ चर के साथ उपलब्ध __all__ पैकेज / मॉड्यूल __all__ है। जब __all__ __init__.py में परिभाषित __all__ चर को देखता है तो यह आपके द्वारा किए जाने पर __all__ चर में सूचीबद्ध मॉड्यूल आयात करता है:

from package import *

__all__ एक ऐसी सूची है जिसमें मॉड्यूल के नाम शामिल हैं जिन्हें आप आयात के साथ आयात करना चाहते हैं * तो हमारे उपरोक्त उदाहरण को फिर से देखकर यदि हम सबपैकेज में __all__ आयात करना चाहते हैं तो __all__ चर subpackage/__init__.py होगा:

__all__ = ['submodule1', 'submodule2']

जब आप प्रदर्शन करते हैं, तो __all__ चर उस तरह से आबादी के साथ

from subpackage import *

यह submodule1 और submodule2 आयात करेगा।

जैसा कि आप देख सकते हैं कि __init__.py बहुत उपयोगी हो सकता है इसके अलावा यह इंगित करता है कि निर्देशिका एक मॉड्यूल है।

Reference





module