есть ли в python способ найти модуль, который содержит переменную или другой объект из самого объекта? - PullRequest
1 голос
/ 13 октября 2011

В качестве примера, скажем, у меня определена переменная, в которой может быть несколько

from __ import *
from ____ import *

и т. Д.

Есть ли способ выяснить, где находится одна из переменных в пространстве именопределяется?

edit

Спасибо, но я уже понимаю, что import * часто считается плохой формой.Это был не вопрос, и в любом случае я не написал это.Было бы неплохо найти способ, откуда взялась переменная.

Ответы [ 4 ]

5 голосов
/ 13 октября 2011

Вот почему в большинстве случаев использование from __ import * в python считается плохим тоном.Либо используйте from __ import myFunc, либо import __ as myLib.Затем, когда вам нужно что-то из myLib, это не пересекает что-то еще.

Для помощи в поиске вещей в текущем пространстве имен, посмотрите библиотеку pprint , dirвстроенный , встроенный локальный , и встроенный глобальный .

3 голосов
/ 13 октября 2011

Нет, имена, определенные from blah import *, не сохраняют никакой информации о том, откуда они пришли. Значения могут иметь подсказку, например, классы имеют атрибут __module__, но они могут быть определены в одном модуле, а затем импортированы из другого, поэтому вы не можете рассчитывать на то, что они являются ожидаемыми значениями.

1 голос
/ 14 октября 2011

Сортировка, например:

>>> from zope.interface.common.idatetime import *
>>> print IDate.__module__
'zope.interface.common.idatetime'
>>> print Attribute.__module__
'zope.interface.interface'

Модуль Attribute может показаться удивительным, поскольку это не то место, куда вы импортировали его из , но именно там был определен тип Attribute . Глядя на zope/interface/common/idatetype.py, мы видим:

from zope.interface import Interface, Attribute

, что объясняет значение __module__. Вы также столкнетесь с проблемами с экземплярами типов, импортированных из других модулей. Предположим, вы создали экземпляр Attribute с именем att:

>>> att = Attribute('foo')
>>> print att.__module__
'zope.interface.interface'

Опять же, вы узнаете, откуда взялся тип , а не где была определена переменная.

Вполне возможно, что главная причина не использовать импорт подстановочных знаков в том, что вы не знаете, что получаете, и они загрязняют ваше пространство имен и, возможно, перекрывают другие типы / переменные.

>>> class Attribute(object):
...    foo = 9
...
>>> print Attribute.foo
9
>>> from zope.interface.common.idatetime import *
>>> print Attribute.foo
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: type object 'Attribute' has no attribute 'foo'

Даже если сегодня import * работает без коллизий, нет гарантии, что это не произойдет с будущими обновлениями импортируемого пакета.

0 голосов
/ 13 октября 2011

Если вы вызовете сам метод в интерпретаторе, он скажет вам, каковы его родительские модули.

Например:

>>> from collections import *
>>> deque
<type 'collections.deque'>
...