2013-05-12 7 views
14

Ich habe mehrere Module in einem Paket (eine Art Toolkit), die ich in meinen Projekten verwende. Die Struktur sieht wie folgt aus:Ausblenden externer Module beim Importieren eines Moduls (z. B. bezüglich Code-Vervollständigung)

the_toolkit: 
    __init__.py 
    basic_io.py 
    simple_math.py 
    matrix_kit.py 
    ... 

Nun, wenn ich IPython oder die Code-Vervollständigung in VIM verwenden, nachdem ein Modul aus dem Paket mit

from the_toolkit import matrix_kit 

Import ich eine Reihe von Modulen/Funktionen erhalten, die matrix_kit.py Importe (array, math, log, loggin, format_exc, etc.), zusammen mit den tatsächlichen Funktionen, die matrix_kit definiert. Wie kann ich alles andere herausfiltern, da ich mich nicht für math oder array in einer Code-Vervollständigung des Moduls matrix_kit interessiert?

Die __init__.py ist leer, wie von vielen pythonistas vorgeschlagen, oder ist es die Art, es zu tun?

+0

Siehe http://StackOverflow.com/a/19757025/1834164, wo erklärt wird, wie '__all__ 'verwendet werden kann, um Module auch in ipython auszublenden. – user1834164

Antwort

15

bekomme ich das gleiche Problem hatte, und löste es, indem eine führende Zugabe von allen meinen Importe unterstreichen. Es sieht nicht genial aus, aber es bringt das, wonach du suchst.

Nur die Dateien, die ohne Unterstreichung beginnen, werden importiert, wenn Sie das Modul mit from .. importieren * importieren. oder wenn Sie Tab-Completion in IPython oder Spyder verwenden.

+0

Das klingt wie eine nette Abhilfe, danke! – tamasgal

0

können Sie einige Kilometer von __all__

+1

Können Sie genauer sein? Sollte ich '__all__' zu allen meinen Modulen innerhalb des Pakets hinzufügen und die wichtigen Funktionen auflisten? (* import * ant, haha) – tamasgal

+0

@second: Haben Sie versucht, '__all__' in einem Modul zu definieren, dann importieren Sie das Modul (kein Star-Import) in IPython? –

+0

Ich benutze nicht das '*' und ich habe versucht, '__all__' in einem Modul hinzuzufügen, aber es löst das Problem nicht. – tamasgal

3

Ich bin gekommen, um diesen Ansatz zu mögen und zu verwenden. Ausgehend von Ihrer Projektstruktur werden wir den gesamten Inhalt von matrix_kit verbergen, den Sie nicht anzeigen möchten.

the_toolkit: 
    __init__.py 
    basic_io.py 
    simple_math.py 
    matrix_kit.py 
    ... 

Verschieben matrix_kit.py in einem Paket mit dem gleichen Namen, und stellen Sie einen Unterstrich am Anfang des Namens des Moduls:

the_toolkit: 
    __init__.py 
    basic_io.py 
    simple_math.py 
    matrix_kit: 
     __init__.py 
     _matrix_kit.py 
    ... 

Jetzt in _matrix_kit.py eine globale Variable hinzufügen __all__ = [...] mit den Namen von alle Funktionen/Klassen/Variablen, die sichtbar sein sollen. Dann in matrix_kit/init Py diese Zeile hinzufügen:

from ._matrix_kit import * 

Es wird nur das Zeug im __all__ Attribute des Moduls aufgelistet importieren. Dann, während Sie matrix_kit importieren, wie Sie es vorher getan haben, werden Sie den __init__.py und seinen Inhalt tatsächlich importieren.

Verwandte Themen