在python中,有没有办法从对象本身找到包含变量或其他对象的模块?

时间:2011-10-13 19:16:19

标签: python namespaces definition

作为一个例子,假设我有一个变量,可能有多个

from __ import *
from ____ import *

有没有办法弄清楚命名空间中某个变量的定义?

修改

谢谢,但我已经明白导入*通常被认为是糟糕的形式。这不是问题,但无论如何我都不写。有一种方法可以找到变量来自哪里。

4 个答案:

答案 0 :(得分:5)

这就是为什么在大多数情况下在python中使用from __ import *被认为是错误的形式。使用from __ import myFuncimport __ as myLib。然后当你需要来自myLib的东西时,它不会超过其他东西。

要查找当前命名空间中的内容,请查看pprint librarythe dir builtinthe locals builtinand the globals builtin

答案 1 :(得分:3)

不,from blah import *定义的名称不会保留有关它们来自何处的任何信息。值可能有一个线索,例如,类具有__module__属性,但它们可能已在一个模块中定义,然后从另一个模块中导入,因此您不能指望它们是您期望的值。 / p>

答案 2 :(得分:1)

排序,例如:

>>> 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的{​​{1}}实例:

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' 没有发生冲突,也无法保证将来导入的软件包更新不会发生。

答案 3 :(得分:0)

如果你在解释器中调用方法本身,它将告诉你它的父模块是什么。

例如:

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