2008-10-09 16 views
7
Bazı Python programcıları oldukça tutarlı aşağıdaki stil kullandığını gördüm

(biz onu arayacağım stili 1):'X ithalatından' versus 'import X; X.a'

import some_module 
# Use some_module.some_identifier in various places. 

bu tarz desteği için, "explicit is better than implicit" atasözünü alıntı yapabilirsiniz.

from some_module import some_identifier 
# Use some_identifier in various places. 

I tarzı 2 gördüğünüz birincil fayda idame - özellikle duck typing ideallerle ben some_other_module için some_module takas isteyebilirsiniz: Başka programcılar bu tarzı (stili 2) kullandığını gördüm. Ben de "readability counts" maxim ile stil 2 kazanır puan hissediyorum. Ben katılmıyorum rağmen, her zaman ilk stilini kullanırken arama ve değiştirme yerine iyi bir seçenek olduğunu iddia edebilir.

Zeyilname: Ben sizin akım modülünde, içinde some_identifier uygulamaya karar da yaygın olduğunu söylemeyi unutmuşum stil 1'de some_other_module için some_module geçişe çözmek için as kullanabileceği kaydedildi hangi eşdeğer bir some_module konteynır oluşturmayı biraz garip hale getirir. Aşağıdaki sözdizimi varlığı ile

cevap

4

Orada iki durumda yönelik kullanımlar, bu yüzden bu birini diğerine konudur sanmıyorum . Ben modülünden import x,y,z gelen kullanarak göz önüne aldığımızda ediyorum: modül adından boşandılar

  • ithal fonksiyonların amacı açıktır ithal etmek şeylerin oldukça az sayıda vardır

    • . Eğer isimler oldukça genel ise, başkalarıyla çatışabilir ve size biraz söylerler. Örneğin. remove'u görmeniz size çok az şey ifade ediyor, ancak os.remove muhtemelen dosyalarla uğraştığınızı ima edecektir.

    • Adlar çakışmıyor. Yukarıdakilere benzer, ama daha önemli. Hiç böyle bir şey yapmak:

      from os import open 
      

    import module [as renamed_module] bunu kullanmak çağrılan ediliyor ne hakkında biraz daha fazla bağlam sağlayan bir avantaja sahiptir. Modül gerçekten daha fazla bilgi vermediğinde ve biraz daha az performans gösterdiğinde (1 yerine 2 arama) bu durumun biraz daha karmaşık olduğu dezavantajına sahiptir. Bununla birlikte, test yaparken de avantajları vardır (örn., Os değerinin değiştirilmesi.).her bir modülü değiştirmek zorunda kalmadan sahte bir nesne ile açın) ve değiştirilebilir modülleri kullanırken, örn. Şüpheniz varsa

    import config 
    config.dburl = 'sqlite:///test.db' 
    

    , hep import module tarzı ile gitmek istiyorum.

  • 5

    :

    import some_other_module as some_module 
    

    tarzı 2'nin korunabilirliği argümanı artık alakalıdır.

    Stil 1 kullanma eğilimindeyim. Normalde, tipik bir Python programında içe aktarılan paket adını yalnızca birkaç kez referans ettiğimi anladım. Diğer her şey, nesnede, içe aktarılan paketi referans olarak kullanmanın gerekmediği yöntemlerdir.

    2

    Genellikle buna karar vermek için bir eşik kullanırım. Ben some_module içinde bir çok şey kullanmak istiyorsanız, ben kullanacağız:

    import some_module as sm 
    x = sm.whatever 
    

    sadece bir veya iki şey varsa o gerekir: farz ediyor

    from some_module import whatever 
    x = whatever 
    

    Ben whatever ihtiyacım yok Tabii ki some_other_module'dan.

    as maddesini içe aktarma konusunda kullanmaya eğilimliyim, böylece yazım adımını ve yerine başka bir modülde daha kolayca değiştirebilirim.

    0

    ben bile yapabilirim (? ... benim gerçekleri kontrol etmeli 2.5 +) Python yeni sürümlerinde inanıyoruz:

    import some_other_module as some_module 
    

    Demek hala daha sonra farklı modülde tarzı 1 ve takas ile gidebiliriz üzerinde.

    Genelde ad alanınızı ne kadar karıştırmak istediğinizle eşleştiğini düşünüyorum. Modülde sadece bir veya iki isim mi kullanıyorsunuz? Ya da hepsi (from x import *, sadece genel olarak kötü değil, genel olarak)?

    1

    Ben notasyonu

    from some_module import some_symbol 
    

    çoğu durumda en iyi çalıştığını görebilirsiniz.Soru devletler gibi

    from some_module import some_symbol as other_symbol 
    

    o modül Adını her zaman, bunu yanlış yazıyor riski ile her seferinde yeniden yazma kaçınır: Ayrıca, sembolün adı çatışması durumunda, kullanabilirsiniz.

    import module [as other_module] 
    

    Sadece iki durumda:

    1. Onlara tüm
    2. modülü almak için modül fonksiyonları/nesnelerin çok fazla kullanmak yürütülürken değişebilir bazı sembol tanımlar ben sözdizimini kullanın
    2

    import X'u tercih ediyorum ve X.a'u olabildiğince kullanıyorum.

    Benim istisna merkezlerim Django gibi büyük bir çerçevede derin iç içe modüller. Onların modül isimleri uzun olma eğilimindedir ve onların örnekleri her yerde django.conf.settings.DEBUG yazarak kaydetmek için tüm from django.conf import settings deyin.

    Modül adı çok iç içe geçmişse, istisna from X.Y.Z import a kullanmaktır.

    0

    Şahsen çoğu durumda ben sadece bir modül ile varken

    import module 
    

    veya mod

    Sadece gerçek farklılığın nedenlerini olarak ithalat modülüdür yapmak, böylece benim ad ile çok fazla karışıklık deneyin Çok kullanılan tek bir sınıf. Orada bazı Funcionality eklemek için list türü sublclassed olsaydı, Kullanayım

    from SuperImprovedListOverloadedWithFeatures import NewLIst 
    nl = NewList() 
    

    vb

    0

    Ben her modülün sadece birkaç üye kullanma eğiliminde, yani benim kodunda

    from john import cleese 
    from terry import jones, gilliam 
    

    bir çok şey var. Modülün çoğunu kullanmayı umuyorum ve modül adı kısasa, tüm modülleri (os veya wx gibi) alacağım. Ayrıca bir isim çakışması varsa tüm modülleri içe aktarırım veya okuyucuya bu işlevin ne ile ilişkili olduğunu hatırlatmak isterim.

    import michael 
    import sarah 
    
    import wave 
    
    gov_speech = wave.open(sarah.palin.speechfile) 
    parrot_sketch = wave.open(michael.palin.justresting) 
    

    from wave import open as wave_open kullanabilirsiniz ama wave.open okuyucuya daha tanıdık olacağını anlamaya.