2009-02-15 6 views
7

In C++ können Sie oft drastisch die Lesbarkeit des Codes durch sorgfältige Verwendung des „mit“ Schlüsselwort, zum Beispiel verbessern:Hat Python etwas wie C++ mit Schlüsselwort?

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

wird

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

Ist für Python etwas ähnliches existiert oder Muss ich alles vollständig qualifizieren?

Ich füge den Haftungsausschluss hinzu, von dem ich weiß, dass die Verwendung seine Fallstricke hat und dass der Umfang angemessen begrenzt sein sollte.

Antwort

19

Wie Bill sagte, tut Python den Bau haben

from X import * 

aber Sie können auch explizit angeben, welcher Namen Sie aus dem Modul (Namespace) importiert werden sollen:

from X import foo, bar, blah 

Dies tendiert dazu, den Code noch besser lesbar zu machen/leichter zu verstehen, da jemand eine Kennung in der Quelle zu sehen, nicht n um alle importierten Module zu durchsuchen, um zu sehen, wo sie herkommen. Hier ist eine weitere Frage: Namespace Specification In Absence of Ambuguity

EDIT: als Antwort auf Pax Kommentar, werde ich erwähnen, dass Sie auch Dinge wie

import X.foo 

schreiben können, aber dann werden Sie schreiben müssen

X.foo.moo() 

statt nur von

foo.moo() 

Das ist natürlich nicht unbedingt schlecht. Ich verwende normalerweise eine Mischung der from X import y und import X.y Formen, was auch immer ich fühle, macht meinen Code am klarsten. Es ist sicherlich eine subjektive Sache in gewissem Maße.

+0

Sie könnten dies erweitern, um "import X" einzuschließen, das Ihnen dann erlaubt, X.y Sachen von diesem Modul zu verwenden. Ich bevorzuge das manchmal, um den Namensraum zu reduzieren. – paxdiablo

+0

Guter Anruf, fertig ;-) –

+1

Warum "anders als C++"? Kannst du nicht "using std :: string;" verwenden? – Constantin

6
import X 

oder

from X import * 

oder

from X import a, b, c 

Wo X ist das Python-Modul, das Sie verwenden möchten.

Es wäre hilfreich für Sie, uns ein Python-Codebeispiel zu geben, das Ihrer Meinung nach bereinigt werden muss.

5

Sicher, Pythons Dynamik macht das trivial. Wenn Sie tief in einem Namespace begraben eine Klasse hatte: foo.bar.baz.blah, können Sie tun:

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

Beachten Sie, dass

from foo import bar 

funktioniert auch, wenn bar ein Modul im foo Paket.Auf diese Weise können Sie die Verschmutzung Ihres Namensraums begrenzen, ohne jede Funktion/Klasse in foo.bar benennen zu müssen, die Sie möglicherweise verwenden möchten. Es hilft auch Lesern Ihres Codes, weil sie einen Anruf an bar.baz() sehen werden und eine bessere Idee haben, woher baz stammt.

1

Neben David Antwort:

  1. Man sollte für einen besseren PEP8 in from X import (foo, bar, blah) runden Klammern verwenden.
  2. Die vollständige Syntax ermöglicht das Umbenennen (erneutes Binden) von Paketnamen an ihre neuen Bezeichner im Rahmen des aktuellen Moduls wie in from foo import bar as baz.

Ich empfehle das Handbuch für die import keyword, die __import__ eingebaut und Erklärung für sys.modules nachzuschlagen als weiterführende Literatur.