2015-05-06 11 views
5

Per esempio, ci sono os.path.walk, os.walk e supponendo un altro md.walk, ed assumere os viene importato ma md non è. Desidero una funzione comeIn Python, dato un nome di funzione, come ottenere tutti i moduli contenenti la funzione?

whereis('walk') 

mentre può restituire os.path.walk, os.walk e md.walk.

O se è difficile sapere che c'è un md.walk, come ottenere il importata os.path.walk e os.walk?

+1

Cosa intendi con "contenente"? Tutti i moduli che importano l'oggetto dal modulo sorgente? Questo è * troppo ampio *; dovresti eseguire la scansione dell'intero disco rigido per tutti i possibili file di origine Python che potrebbero a un certo punto importare il modulo e utilizzare la funzione. –

+2

Non trovo la domanda particolarmente poco chiara. Il fatto che non ci sia una risposta facile non significa che la domanda non sia valida. Per il refactoring (ad esempio) può essere molto utile sapere quali moduli si riferiscono a una particolare funzione. –

+0

Quindi ora stai cercando un nome di stringa. Che dire dei moduli dove 'walk' è una funzione completamente diversa? O un metodo? O un altro tipo di oggetto. –

risposta

3

OK, è stato divertente, ecco la soluzione aggiornata. Qualche magia Python, soluzione per Python 2.7. Qualsiasi miglioramento è benvenuto. Si comporta come qualsiasi altra importazione, quindi fai attenzione a includere il codice eseguibile in if name == "__main__".

import inspect 
import pkgutil 
import sys 

def whereis_in_globals(fname): 
    return [m for m in sys.modules.itervalues() 
      if module_has_function(m, fname)] 

def whereis_in_locals(fname): 
    modules = (__import__(module_name, globals(), locals(), [fname], -1) 
       for _, module_name, _ in pkgutil.walk_packages(path=".")) 
    return [m for m in modules if module_has_function(m, fname)] 

def module_has_function(m, fname): 
    return hasattr(m, fname) and inspect.isfunction(getattr(m, fname)) 

if __name__ == "__main__": 
    # these should never raise AttributeError 
    for m in whereis_in_locals('walk'): 
     m.walk 
    for m in whereis_in_globals('walk'): 
     m.walk 
+1

Funziona solo per i moduli che sono già stati importati. –

+3

Avvertenza: funziona solo se i moduli rilevanti sono importati, ma +1 poiché è ancora un buon approccio. – nneonneo

1

Puoi dirci di più sul tuo caso d'uso o su obiettivi più grandi? Ottenere questa risposta per i moduli non importati è una sfida interessante, e non ho una risposta per come l'hai formulata, ma a seconda del tuo caso di utilizzo effettivo potresti essere interessato a sapere che potrebbero esserci IDE (Integrated Development Environments) puoi fare quello che stai chiedendo.

Ad esempio se si installa PyCharm (disponibile gratuitamente in edizione community) è possibile digitare un nome di funzione completo o parziale (solo una stringa di testo) e quindi fare in modo che l'IDE cerchi il progetto attivo per vedere cosa si potrebbe cercare . Ad esempio, puoi semplicemente digitare "walk" su una riga e quindi (IIR) Ctrl-clic su di esso per vedere quali moduli possibili potresti avere funzioni di corrispondenza. Puoi anche cercare nell'altra direzione, vedendo dove in un progetto viene utilizzata la funzione.

Per cercare su una scala più ampia potresti dover barare un po 'e aprire la tua directory Python come "progetto" ma è facile.

Anche in questo caso, non è stato fornito un caso d'uso, quindi mi scuso se si sta cercando specificamente, ad esempio, un modo in-script per ottenere quel risultato per un uso successivo in un programma. Se è qualcosa che vuoi una risposta per te, come sviluppatore e mentre lavori, potresti guardare agli strumenti che stai utilizzando per fornire una risposta.

Problemi correlati