例如,我定义了一个变量,其中可能存在多个变量。
from __ import *
from ____ import *等。
是否有一种方法可以确定名称空间中的一个变量是在哪里定义的?
编辑
谢谢,但我已经明白导入*通常被认为是糟糕的形式。但这不是问题,而且无论如何我也没有写。如果能找到变量的来源,那就太好了。
发布于 2011-10-13 19:21:40
这就是为什么在大多数情况下在python中使用from __ import *被认为是不好的形式。要么使用from __ import myFunc,要么使用import __ as myLib。然后,当你需要从myLib的东西,它不会超越其他的东西。
有关在当前命名空间中查找内容的帮助,请查看pprint库、dir积木、当地人建的、和全球的内在。
发布于 2011-10-13 19:22:21
不,from blah import *定义的名称不保留来自何处的任何信息。这些值可能有一个线索,例如,类有一个__module__属性,但它们可能是在一个模块中定义的,然后从另一个模块导入,所以您不能指望它们就是您所期望的值。
发布于 2011-10-13 20:36:25
例如,某种类型:
>>> 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 *在没有冲突的情况下工作,也不能保证它不会在将来导入包的更新时发生。
https://stackoverflow.com/questions/7759290
复制相似问题