Как найти, где функция была импортирована из Python?

У меня есть модуль Python с функцией в нем:

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

И затем я импортирую его в глобальное пространство имен так:

from bar import *

Итак, теперь функция foo доступна мне. Если я его распечатаю:

print foo

Переводчик с радостью сообщает мне:

 <function foo at 0xb7eef10c>

Есть ли способ узнать, что функция foo появилась из модуля bar в этот момент?

Ответ 1

foo.__module__ должен возвращать bar

Если вам нужна дополнительная информация, вы можете получить ее от sys.modules['bar'], ее атрибуты __file__ и __package__ могут быть интересными.

Ответ 2

Попробуйте следующее:

help(foo.func_name)

Ответ 3

Вместо

from bar import *

использовать

from bar import foo

Использование синтаксиса from ... import * - плохой стиль программирования именно потому, что ему трудно понять, откуда взялись элементы вашего пространства имен.

Ответ 4

Если у вас есть IPython, вы также можете использовать ? :

In[16]: runfile?
Signature: runfile(filename, args=None, wdir=None, is_module=False, global_vars=None)
Docstring:
Run filename
args: command line arguments (string)
wdir: working directory
File:      /Applications/PyCharm.app/Contents/helpers/pydev/_pydev_bundle/pydev_umd.py
Type:      function

Сравните с __module__:

In[17]:  runfile.__module__
Out[17]: '_pydev_bundle.pydev_umd'