2009-11-13 12 views
9

Ho un modulo Python con una funzione in esso:Come trovare da dove è stata importata una funzione in Python?

== bar.py == 
    def foo(): pass 
    == EOF == 

E poi importarlo nel namespace globale in questo modo:

from bar import * 

Così ora la funzione foo è a mia disposizione. Se lo stampo:

print foo 

L'interprete mi dice allegramente:

<function foo at 0xb7eef10c> 

C'è un modo per me di scoprire che la funzione foo venuto dal modulo bar a questo punto?

+0

Perché stai usando 'dalla barra di importazione *'? Perché questo? Questa specifica sintassi è ciò che causa il tuo problema, quindi perché farlo? –

risposta

18

foo.__module__ dovrebbe restituire bar

Se avete bisogno di ulteriori informazioni, si può ottenere da sys.modules['bar'], le sue __file__ e __package__ attributi possono essere interessante.

+0

Questo attributo __package__ è davvero interessante, ma sembra non essere disponibile. È disponibile in Python 2.5.2? –

+1

Ah no, sembra nuovo in Python 2.6: http://www.python.org/doc/2.6/whatsnew/2.6.html#pep-366-explicit-relative-imports-from-a-main-module – Wim

+0

Ok , quindi ho studiato un po 'la cosa __package__. Quello che non posso dire è se il valore è aggiunto di default, o se devo specificare qualcosa. Ho provato a importare un modulo vuoto ("z.xx") e z.xx .__ package__ ha restituito None. Sto facendo qualcosa di sbagliato? –

1

Invece di

from bar import * 

uso

from bar import foo 

Utilizzando la sintassi from ... import * è uno stile di programmazione male proprio perché rende difficile sapere dove elementi dal tuo spazio dei nomi.

+0

+1 perché questo è un punto valido, anche se potrebbe non risolvere il problema (se l'interrogante vuole sapere da dove viene la funzione di programmazione, avere 'from bar import foo' è praticamente lo stesso) – dbr

Problemi correlati