2009-11-13 5 views
9

J'ai un module Python avec une fonction en elle:Comment trouver d'où une fonction a été importée en Python?

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

Et puis je l'importer dans l'espace de noms global comme ceci:

from bar import * 

Alors maintenant, la fonction foo est disponible pour moi. Si je l'imprimer:

print foo 

L'interprète me dit joyeusement:

<function foo at 0xb7eef10c> 

est-il un moyen pour moi de savoir que la fonction foo est venu du module bar à ce point?

+0

Pourquoi utilisez-vous 'from import bar '? Pourquoi faire ceci? Cette syntaxe spécifique est ce qui cause votre problème, alors pourquoi le faire? –

Répondre

18

foo.__module__ devrait retourner bar

Si vous avez besoin de plus d'info, vous pouvez l'obtenir à partir sys.modules['bar'], ses attributs __file__ et __package__ peuvent être intéressantes.

+0

Cet attribut __package__ est vraiment cool, mais il semble être indisponible. Est-il disponible en python 2.5.2? –

+1

Ah non, il semble nouveau dans 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 J'ai donc fait un peu de recherche sur le paquet __package__. Ce que je ne peux pas dire, c'est si la valeur est ajoutée par défaut, ou si je dois spécifier quelque chose. J'ai essayé d'importer un module vide ("z.xx"), et z.xx .__ package__ a retourné None. Est-ce que je fais quelque chose de mal? –

1

Au lieu de

from bar import * 

utilisation

from bar import foo 

En utilisant la syntaxe from ... import * est un mauvais style de programmation précisément parce qu'il rend difficile de savoir où les éléments de votre espace de nom viennent.

+0

+1 parce que c'est un point valide, bien qu'il ne puisse pas résoudre le problème (si le questionneur veut savoir d'où vient la fonction par programmation, avoir 'de bar import foo' est fondamentalement le même) – dbr

Questions connexes