2013-05-12 10 views
14

Ho diversi moduli in un unico pacchetto (una sorta di toolkit), che utilizzo nei miei progetti. La struttura si presenta così:Nascondere moduli esterni durante l'importazione di un modulo (ad esempio per quanto riguarda il completamento del codice)

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

Ora quando uso IPython o il completamento del codice in VIM dopo l'importazione di un modulo dal pacchetto con

from the_toolkit import matrix_kit 

ho un mucchio di moduli/funzioni che matrix_kit.py importazioni (array, math, log, loggin, format_exc, ecc.), Insieme alle funzioni effettive definite da matrix_kit. Come posso escludere tutto il resto, dal momento che non sono interessato a math o array in un completamento del codice del modulo matrix_kit?

Il __init__.py è vuoto come suggerito da molti pythonistas, o è il modo di farlo?

+0

Vedere http://stackoverflow.com/a/19757025/1834164 che spiega come '__all__ 'può essere utilizzato per nascondere i moduli anche in ipython. – user1834164

risposta

15

Ho avuto lo stesso problema e risolto con l'aggiunta di un underscore a tutti i miei importazioni. Non sembra brillante, ma raggiunge quello che cerchi.

from __future__ import division as _division 
import numpy as _np 
import pandas as _pd 

Solo la roba che si avvia senza una sottolineatura viene importato quando si importa il modulo utilizzando da .. import *. o quando usi il tab-completion in IPython o spyder.

+0

Questo suona come una buona soluzione, grazie! – tamasgal

0

si può ottenere qualche chilometraggio di __all__

+1

Potresti essere più specifico? Dovrei aggiungere '__all__' a tutti i miei moduli all'interno del pacchetto e elencare le funzioni che sono importanti? (* import * ant, haha) – tamasgal

+0

@second: hai provato a definire '__all__' in un modulo quindi a importare il modulo (non eseguendo un'importazione a stella) in IPython? –

+0

Non uso '*' e ho provato ad aggiungere '__all__' in un modulo, ma non risolve il problema. – tamasgal

3

Sono arrivato ad apprezzare questo approccio. A partire dalla struttura del tuo progetto, nascondiamo tutti i contenuti di matrix_kit che non vuoi mostrare.

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

Spostare matrix_kit.py in un pacchetto con lo stesso nome, e mettere una sottolineatura all'inizio del nome del modulo:

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

Ora, in _matrix_kit.py aggiungere una variabile globale __all__ = [...] elenca i nomi di tutte le funzioni/classi/variabili che vuoi essere visibili. Poi, nel matrix_kit/init .PY aggiungere questa riga:

from ._matrix_kit import * 

E 'solo importare la roba di cui l'attributo __all__ del modulo. Quindi, durante l'importazione di matrix_kit come in precedenza, importerai effettivamente lo __init__.py e il suo contenuto.

Problemi correlati