2009-02-15 12 views
7

:Python'un anahtar kelimeyi kullanarak C++ gibi bir şeyleri var mı? Sık sık büyük ölçüde örneğin, "kullanılarak" anahtar kelimenin dikkatli kullanımı ile kodunuzun okunabilirliği artırmak C++

void foo() 
{ 
    std::vector< std::map <int, std::string> > crazyVector; 
    std::cout << crazyVector[0].begin()->first; 
} 

olur

void foo() 
{ 
    using namespace std; // limited in scope to foo 
    vector< map <int, string> > crazyVector; 
    cout << crazyVector[0].begin()->first; 
} 

piton için benzer bir şey var mı, ya da Her şeyi tam olarak nitelendirmek zorunda mıyım?

Ben kullanarak tuzaklar var olduğunu biliyoruz yasal uyarı ekleriz ve uygun kapsam açısından sınırlı olmalıdır.

cevap

19

Bill dediği gibi, Python inşaat

from X import * 

var ama aynı zamanda can açıkça modül (ad) ithal istediğiniz hangi isimler belirtin:

from X import foo, bar, blah 

Bu kaynakta bir tanımlayıcı n yok gördükten birisi beri, hatta daha okunabilir kod/kolay anlamak için eğilimindedir nereden geldiğini görmek için tüm ithal modülleri avlamak için eed. Namespace Specification In Absence of Ambuguity

DÜZENLEME: Burada ilgili soru Pax yorumuna cevaben, ben de

import X.foo 

gibi şeyler yazabilir söz edeceğiz ama o zaman yazmak gerekir

X.foo.moo() 

yerine sadece

foo.moo() 

Bu elbette kötü bir şey değil elbette. Kodumu en açık hale getirdiğim her ne olursa olsun, genellikle from X import y ve import X.y formlarının bir karışımını kullanırım. Kesinlikle bir dereceye kadar öznel bir şey.

from foo import bar 

barfoo paketinde bir modül olsa bile çalıştığını

+0

"İçe aktarma X" i içerecek şekilde genişletmek isteyebilirsiniz; bu durumda X.y'yi bu modülde kullanmanıza izin verir. Bazen isim alanını kirletmek için bunu tercih ederim. – paxdiablo

+0

İyi çağrı, bitti ;-) –

+1

Neden "C++ 'dan farklı"? "Std :: string; kullanarak" kullanamaz mısınız? – Constantin

6
import X 

veya

from X import * 

veya X'in kullanmak istediğiniz Python modülü

from X import a, b, c 

.

Temizlenmesini düşündüğünüz bir Python kod örneği vermeniz size yardımcı olacaktır.

5

Elbette, python'un dinamizmi bunu önemsiz kılıyor. Eğer bir bir ad alanında derin gömülü sınıfı olsaydı: foo.bar.baz.blah, yapabileceğiniz:

def foo: 
    f = foo.bar.baz.blah 
    f1 = f() 
0

Not.Bu, kullanmanızın gerekebileceği foo.bar'daki her bir işlevi/sınıfı adlandırmak zorunda kalmadan ad alanı kirliliğinizi sınırlandırmanızı sağlar. Ayrıca, bar.baz() numaralı aramayı görecekleri ve baz'un nereden geldiğini daha iyi bir fikre sahip oldukları için kodunuzun okuyucularına da yardımcı olur. David'in cevap ilaveten

1

:

  1. biri PEP8 bir uğruna from X import (foo, bar, blah) yuvarlak parantez kullanmalıdır.
  2. Tam sözdizimi, paket adlarını from foo import bar as baz'daki geçerli modül kapsamındaki yeni tanımlayıcılarına yeniden adlandırmaya (yeniden oluşturmaya) izin verir.

Ben sys.modules gibi başka okuma için import keyword için kılavuzu, __import__ yerleşik ve açıklama bakmak tavsiye ederiz.

İlgili konular