__─░nit__.py ne i├žin?


Al─▒nan cevaba git


Ne __init__.py bir Python kaynak dizinde i├žin?


2028





2009-01-15




Cevap say─▒s─▒n─▒ say: 11






Bir paketin gerekli bir par├žas─▒yd─▒ ( eski, 3.3 ├Âncesi "normal paket" , daha yeni olmayan 3.3+ "ad alan─▒ paketi" ).

─░┼čte belgeler.

Python iki t├╝r paket tan─▒mlar: normal paketler ve ad alan─▒ paketleri. Normal paketler Python 3.2 ve daha ├Ânceki s├╝r├╝mlerde bulunan geleneksel paketlerdir. Normal bir paket genellikle bir __init__.py dosya i├žeren bir dizin olarak uygulan─▒r . Normal bir paket al─▒nd─▒─č─▒nda, bu __init__.py dosya ├Ârt├╝k olarak y├╝r├╝t├╝l├╝r ve tan─▒mlad─▒─č─▒ nesneler paketin ad alan─▒ndaki adlara ba─član─▒r. __init__.py Dosya ba┼čka mod├╝l i├žerebilir ayn─▒ Python kodunu i├žerebilir ve i├že aktar─▒ld─▒─č─▒nda Python mod├╝l├╝ne baz─▒ ek ├Âzellikler eklemek olacakt─▒r.

Fakat sadece ba─člant─▒ya t─▒klay─▒n, bir ├Ârnek, daha fazla bilgi ve isimsiz paketlerin bir a├ž─▒klama i├žermeyen paketlerin bir t├╝r├╝n├╝ i├žerir __init__.py .


1299


2009-01-15





Adland─▒r─▒lm─▒┼č dosyalar __init__.py diskteki dizinleri Python paket dizinleri olarak i┼čaretlemek i├žin kullan─▒l─▒r. Dosyalar─▒n varsa

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

ve mydir senin yolunda, sen kod alabilirsiniz module.py olarak

 import spam.module
 

veya

 from spam import module
 

__init__.py Dosyay─▒ kald─▒r─▒rsan─▒z , Python art─▒k bu dizinde alt mod├╝ller aramayacakt─▒r, bu nedenle mod├╝l├╝ i├že aktarma giri┼čimleri ba┼čar─▒s─▒z olacakt─▒r.

__init__.py Dosyas─▒ genellikle bo┼č, ancak, ├Ârne─čin, yukar─▒da verilen vb daha uygun ad─▒, tutma kolayl─▒─č─▒ fonksiyonlar─▒ alt─▒nda paketin se├žilen k─▒s─▒mlar─▒n─▒ vermek i├žin kullan─▒labilir, init mod├╝l├╝n├╝n i├žeri─či olarak eri┼čilebilir

 import spam
 

dayal─▒ bu


761







Python paket olarak bir dizin etiketleme ve tan─▒mlaman─▒n yan─▒ s─▒ra __all__ , __init__.py paket d├╝zeyinde herhangi de─či┼čken tan─▒mlamak i├žin izin verir. Bir paket, API benzeri bir tarzda s─▒k s─▒k i├že aktar─▒lacak bir ┼čey tan─▒ml─▒yorsa, bunu yapmak genellikle uygundur. Bu model, Pythonic "d├╝zlemin yuvalanm─▒┼č" felsefeye daha iyi uymas─▒n─▒ sa─člar.

Bir ├Ârnek

─░┼čte benim veritaban─▒mla etkile┼čime girmek i├žin s─▒k s─▒k sessionmaker ├ža─čr─▒lan bir ithalat yapt─▒─č─▒m projelerimden bir ├Ârnek Session . Birka├ž mod├╝l i├žeren bir "veritaban─▒" paketi yazd─▒m:

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

Benim __init__.py kodum a┼ča─č─▒daki kodu i├žeriyor:

 import os

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine

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

Session Burada tan─▒mlad─▒─č─▒mdan beri , a┼ča─č─▒daki s├Âzdizimini kullanarak yeni bir oturum ba┼člatabilirim. Bu kod, "veritaban─▒" paket dizininin i├žinden veya d─▒┼č─▒ndan y├╝r├╝t├╝lenle ayn─▒ olacakt─▒r.

 from database import Session
session = Session()
 

Elbette, bu k├╝├ž├╝k bir kolayl─▒k - alternatif, Session veritaban─▒ paketimdeki "create_session.py" gibi yeni bir dosyada tan─▒mlamak ve a┼ča─č─▒dakileri kullanarak yeni oturumlar ba┼člatmak olabilir:

 from database.create_session import Session
session = Session()
 

daha fazla okuma

Burada uygun kullan─▒mlar─▒ kapsayan olduk├ža ilgin├ž bir reddit ipli─či __init__.py var:

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

├ço─čunluk g├Âr├╝┼č├╝ __init__.py , "a├ž─▒k" ├Ârt├╝k olmaktan iyidir "felsefesini ihlal etmemek i├žin dosyalar─▒n ├žok ince olmas─▒ gerekti─či gibi g├Âr├╝nmektedir .


454







Bunun 2 ana nedeni var. __init__.py

  1. Kolayl─▒k sa─člamak i├žin, di─čer kullan─▒c─▒lar─▒n i┼člevlerinizin paket s─▒rad├╝zeninizdeki yerini tam olarak bilmeleri gerekmez.

     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
     

    o zaman di─čerleri arayabilir (add)

     from your_package import add
     

    dosya1 bilmeden, gibi

     from your_package.file1 import add
     
  2. Bir ┼čeyin ba┼člat─▒lmas─▒n─▒ istiyorsan─▒z; ├Ârne─čin, g├╝nl├╝k kayd─▒ (en ├╝st seviyeye konmas─▒ gerekir):

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

193







__init__.py Dosya mod├╝l olarak bunu i├žeren Python tedavi dizinleri yapar.

Ayr─▒ca, bu mod├╝le ilk y├╝klenen dosyad─▒r, b├Âylece bir mod├╝l her y├╝klendi─činde ├žal─▒┼čt─▒rmak istedi─činiz kodu ├žal─▒┼čt─▒rmak veya d─▒┼ča aktar─▒lacak alt mod├╝lleri belirtmek i├žin kullanabilirsiniz.


104







Python 3.3'ten itibaren, __init__.py dizinleri al─▒nabilir Python paketleri olarak tan─▒mlamak i├žin art─▒k gerekli de─čildir.

PEP 420: ├ľrt├╝k Ad Alan─▒ Paketlerini Kontrol Edin :

__init__.py ─░┼čaretleyici dosya gerektirmeyen ve otomatik olarak birden ├žok yol dilimine yay─▒labilen paket dizinleri i├žin yerel destek ( PEP 420'de a├ž─▒kland─▒─č─▒ gibi, ad alan─▒ paketlerine ├že┼čitli ├╝├ž├╝nc├╝ taraf yakla┼č─▒mlardan ilham al─▒nd─▒ )

─░┼čte test:

 $ 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
 

referanslar:
https://docs.python.org/3/whatsnew/3.3.html#pep-420-implicit-namespace-packages
https://www.python.org/dev/peps/pep-0420/
is __init__. Python 3'teki paketler i├žin py gerekmez mi?


80







Python'da paket tan─▒m─▒ ├žok basittir. Java gibi hiyerar┼čik yap─▒ ve dizin yap─▒s─▒ ayn─▒d─▒r. Ama __init__.py bir paket i├žinde olmak zorundas─▒n . __init__.py Dosyay─▒ a┼ča─č─▒daki ├Ârnekle a├ž─▒klayaca─č─▒m :

 package_x/
|--  __init__.py
|--    subPackage_a/
|------  __init__.py
|------  module_m1.py
|--    subPackage_b/
|------  __init__.py
|------  module_n1.py
|------  module_n2.py
|------  module_n3.py
 

__init__.py var oldu─ču s├╝rece bo┼č olabilir. Dizinin bir paket olarak g├Âr├╝lmesi gerekti─čini belirtir. Tabii ki, __init__.py uygun i├žeri─či de ayarlayabilirsiniz.

Module_n1'de bir i┼člev eklersek:

 def function_X():
    print "function_X in module_n1"
    return
 

Ko┼čudan sonra:

 >>>from package_x.subPackage_b.module_n1 import function_X
>>>function_X()

function_X in module_n1 
 

Sonra s─▒rad├╝zen paketini takip ettik ve module_n1 i┼člevini ├ža─č─▒rd─▒k. __init__.py SubPackage_b i├žinde ┼ču ┼čekilde kullanabilirsiniz :

 __all__ = ['module_n2', 'module_n3']
 

Ko┼čudan sonra:

 >>>from package_x.subPackage_b import * 
>>>module_n1.function_X()

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named module_n1
 

Bu nedenle * import ├Âzelli─čini kullanarak mod├╝l paketi __init__.py i├žeri─če tabidir .


51







Python'un bir __init__.py dosya olmadan ├žal─▒┼čmas─▒na ra─čmen , yine de bir tane eklemelisiniz.

Bir paketin bir mod├╝l olarak ele al─▒nmas─▒ gerekti─čini belirtir, bu nedenle onu i├žerir (bo┼č olsa bile).

Bir __init__.py dosyay─▒ ger├žekten kullanabilece─činiz bir durum da var :

A┼ča─č─▒daki dosya yap─▒s─▒na sahip oldu─čunuzu hayal edin:

 main_methods 
    |- methods.py
 

Ve bunu methods.py i├žerdi:

 def foo():
    return 'foo'
 

Kullanmak foo() i├žin a┼ča─č─▒dakilerden birine ihtiyac─▒n─▒z olacak:

 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()
 

Belki orada gerekmez (veya istiyorum) tutmak i├žin methods.py i├žeride main_methods (├Ârne─čin ├žal─▒┼čt─▒r─▒c─▒lar─▒ / ba─č─▒ml─▒l─▒klar─▒) ama sadece ithalat istiyoruz main_methods .


E─čer ad─▒n─▒ de─či┼čtirdiyseniz methods.py i├žin __init__.py o zaman kullanabilirsiniz foo() sadece ithal ederek main_methods :

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

Bu ├žal─▒┼č─▒r ├ž├╝nk├╝ __init__.py paketin bir par├žas─▒ olarak kabul edilir.


Baz─▒ Python paketleri asl─▒nda bunu yapar. Bir ├Ârnek ile JSON ├žal─▒┼čan, import json asl─▒nda ithal etmektedir __init__.py dan json (pakete burada paket dosyas─▒ yap─▒s─▒n─▒ g├Ârmek ):

Kaynak kodu: Lib/json/__init__.py


45







__init__.py Dizine y├╝klenebilir bir mod├╝l olarak bakacak.

Kod okumay─▒ tercih eden insanlar i├žin, Two-Bit Alchemist'in yorumunu buraya yazd─▒m .

 $ 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
>>> 
 

38







Di─čer python dosyalar─▒n─▒ i├že aktarmay─▒ kolayla┼čt─▒r─▒r. Bu dosyay─▒ di─čer py dosyalar─▒n─▒ i├žeren bir dizine (bir ┼čey s├Âyle) yerle┼čtirdi─činizde, o zaman import stuff.other gibi bir ┼čey yapabilirsiniz.

 root\
    stuff\
         other.py

    morestuff\
         another.py
 

Bu __init__.py , dizin i├žindeki nesneler olmadan , other.py dosyas─▒n─▒ i├že aktaramazs─▒n─▒z, ├ž├╝nk├╝ Python, kaynak kodunun nerede oldu─čunu bilmiyor ve onu bir paket olarak tan─▒yam─▒yor.


29







Bir __init__.py dosya ithalat─▒ kolayla┼čt─▒r─▒r. Bir __init__.py paket i├žinde bir mevcut oldu─čunda , i┼člev a() ┼ču ┼čekilde dosyadan al─▒nabilir b.py :

 from b import a
 

Ancak, onsuz do─črudan i├že aktaramazs─▒n─▒z. Sistem yolunu de─či┼čtirmeniz gerekir:

 import sys
sys.path.insert(0, 'path/to/b.py')

from b import a
 

7



─░lgili yay─▒nlar


Setup.py nedir?

CodeMash 2012 i├žin 'Wat' konu┼čmas─▒nda bahsedilen bu tuhaf JavaScript davran─▒┼člar─▒n─▒n a├ž─▒klamas─▒ nedir?

Haskell ger├žek d├╝nyada ne i├žin kullan─▒l─▒r? [kapal─▒]

__Main__.py nedir?

IEEE754 NaN de─čerleri i├žin false d├Ând├╝ren t├╝m kar┼č─▒la┼čt─▒rmalar─▒n mant─▒─č─▒ nedir?

@JsonProperty ├Âzelli─či ne zaman kullan─▒l─▒r ve ne i├žin kullan─▒l─▒r?

Android anahtar deposu dosyas─▒ nedir ve ne i├žin kullan─▒l─▒r?

HashCode ne i├žin kullan─▒l─▒r? Benzersiz mi

K─▒vr─▒lman─▒n k├╝t├╝phaneyi ├╝cretsiz olarak serbest b─▒rakmas─▒ i├žin te┼čvik nedir? [kapal─▒]

ESB nedir ve ne i├žin iyidir?

Etiketle ilgili di─čer sorular [python]


O (log n) tam olarak ne anlama geliyor?

Python'da bir yoldan uzant─▒ olmadan dosya ad─▒n─▒ nas─▒l alabilirim?

Neden bir yap─▒ i├žin sizeof, her ├╝yenin toplam─▒n─▒n say─▒s─▒na e┼čit de─čil?

G├Âm├╝l├╝ kaynak metin dosyas─▒ nas─▒l okunur

JavaScript kullanarak resim boyutu (y├╝kseklik ve geni┼člik) nas─▒l al─▒n─▒r?

'$ (This)' ve 'this' aras─▒ndaki fark nedir?

Neden ÔÇť├ľrt├╝k A├ž─▒lmayan OpsiyonlarÔÇŁ yarat─▒yor, ├ž├╝nk├╝ bu bir de─čer oldu─čunu bildi─činiz anlam─▒na geliyor?

Bir ├žocuk ├žapa t─▒kland─▒─č─▒nda ebeveynin onclick etkinli─činin kovulmas─▒n─▒ nas─▒l ├Ânlerim?

__Get__ ve __set__ ve Python tan─▒mlay─▒c─▒lar─▒n─▒ anlama

Bir <input> b├Âl├╝m├╝ne ÔÇťsalt okunurÔÇŁ bir ├Âznitelik nas─▒l eklenir?