2009-11-13 13 views
9

que tienen un módulo de Python con una función en ella:¿Cómo encontrar de dónde se importó una función en Python?

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

Y luego importarlo en el espacio de nombres global de este modo:

from bar import * 

Así que ahora la función foo está disponible para mí. Si lo imprimo:

print foo 

El intérprete felizmente me dice:

<function foo at 0xb7eef10c> 

¿Hay alguna forma para mí encontrar a cabo esa función foo vino de módulo bar en este punto?

+0

¿Por qué está utilizando 'from bar import *'? ¿Por qué hacer esto? Esta sintaxis específica es lo que causa su problema, entonces, ¿por qué hacerlo? –

Respuesta

18

foo.__module__ debe devolver bar

Si necesita más información, puede obtenerla de sys.modules['bar'], sus __file__ y __package__ atributos pueden ser interesantes.

+0

Este atributo __package__ es realmente genial, pero parece que no está disponible. ¿Está disponible en python 2.5.2? –

+1

Ah no, parece nuevo en Python 2.6: http://www.python.org/doc/2.6/whatsnew/2.6.html#pep-366-expllicit-relative-imports-from-a-main-module – Wim

+0

Ok , así que investigué un poco la cuestión del paquete __package__. Lo que no puedo decir es si el valor se agrega por defecto, o si tengo que especificar algo. Intenté importar un módulo vacío ("z.xx") y z.xx .__ package__ devolvió None. ¿Estoy haciendo algo mal? –

1

En lugar de

from bar import * 

uso

from bar import foo 

Utilizando la sintaxis from ... import * es un estilo de programación mal precisamente porque hace que sea difícil saber los elementos donde de tu espacio de nombres provienen.

+0

+1 porque este es un punto válido, aunque puede no resolver el problema (si el interlocutor quiere saber de dónde viene la función programáticamente, tener 'from bar import foo' es básicamente el mismo) – dbr

Cuestiones relacionadas