作为一个例子,假设我有一个变量,可能有多个
from __ import *
from ____ import *
等
有没有办法弄清楚命名空间中某个变量的定义?
修改的
谢谢,但我已经明白导入*通常被认为是糟糕的形式。这不是问题,但无论如何我都不写。有一种方法可以找到变量来自哪里。
答案 0 :(得分:5)
这就是为什么在大多数情况下在python中使用from __ import *
被认为是错误的形式。使用from __ import myFunc
或import __ as myLib
。然后当你需要来自myLib
的东西时,它不会超过其他东西。
要查找当前命名空间中的内容,请查看pprint library,the dir builtin,the locals builtin,and 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'>