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




module (7)

एक पायथन पैकेज के रूप में निर्देशिका को लेबल करने और __all__ को परिभाषित करने के __all__ , __init__.py आपको पैकेज स्तर पर किसी भी चर को परिभाषित करने की अनुमति देता है। ऐसा करना अक्सर सुविधाजनक होता है यदि कोई पैकेज किसी एपीआई जैसी फैशन में अक्सर आयात किए जाने वाले किसी चीज़ को परिभाषित करता है। यह पैटर्न पाइथोनिक "फ्लैट नेस्टेड से बेहतर है" दर्शन का पालन करता है।

एक उदाहरण

यहां मेरी एक परियोजना से एक उदाहरण दिया गया है, जिसमें मैं अक्सर अपने डेटाबेस के साथ बातचीत करने के लिए Session नामक एक Session sessionmaker आयात करता sessionmaker । मैंने कुछ मॉड्यूल के साथ "डेटाबेस" पैकेज लिखा था:

database/
    __init__.py
    schema.py
    insertions.py
    queries.py

मेरे __init__.py में निम्न कोड है:

import os

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine

engine = create_engine(os.environ['DATABASE_URL'])
Session = sessionmaker(bind=engine)

चूंकि मैं यहां Session परिभाषित करता हूं, इसलिए मैं नीचे दिए गए वाक्यविन्यास का उपयोग करके एक नया सत्र शुरू कर सकता हूं। यह कोड "डेटाबेस" पैकेज निर्देशिका के अंदर या बाहर से निष्पादित किया जाएगा।

from database import Session
session = Session()

बेशक, यह एक छोटी सुविधा है - विकल्प मेरे डेटाबेस पैकेज में "create_session.py" जैसी नई फ़ाइल में Session को परिभाषित करना होगा, और नए सत्रों का उपयोग करके प्रारंभ करना होगा:

from database.create_session import Session
session = Session()

आगे की पढाई

__init__.py उपयुक्त उपयोगों को कवर करने वाला एक बहुत ही रोचक रेडडिट थ्रेड है:

http://www.reddit.com/r/Python/comments/1bbbwk/whats_your_opinion_on_what_to_include_in_init_py/

बहुमत की राय यह प्रतीत होती है कि "स्पष्ट से स्पष्ट स्पष्ट" दर्शन का उल्लंघन करने से बचने के लिए __init__.py फ़ाइलें बहुत पतली होनी चाहिए।

एक पायथन स्रोत निर्देशिका में __init__.py क्या है?


चूंकि पायथन 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 की आवश्यकता नहीं है?


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

root\
    stuff\
         other.py

    morestuff\
         another.py

निर्देशिका सामग्री के अंदर इस __init__.py बिना, आप अन्य.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 फ़ाइल पाइथन उपचार निर्देशिकाओं को मॉड्यूल के रूप में बनाती है।

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


__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