首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在python中,是否有方法从对象本身找到包含变量或其他对象的模块?

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

Stack Overflow用户
提问于 2011-10-13 19:16:18
回答 4查看 197关注 0票数 1

例如,我定义了一个变量,其中可能存在多个变量。

代码语言:javascript
运行
复制
from __ import *
from ____ import *

等。

是否有一种方法可以确定名称空间中的一个变量是在哪里定义的?

编辑

谢谢,但我已经明白导入*通常被认为是糟糕的形式。但这不是问题,而且无论如何我也没有写。如果能找到变量的来源,那就太好了。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-10-13 19:21:40

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

有关在当前命名空间中查找内容的帮助,请查看pprint库dir积木当地人建的和全球的内在

票数 5
EN

Stack Overflow用户

发布于 2011-10-13 19:22:21

不,from blah import *定义的名称不保留来自何处的任何信息。这些值可能有一个线索,例如,类有一个__module__属性,但它们可能是在一个模块中定义的,然后从另一个模块导入,所以您不能指望它们就是您所期望的值。

票数 3
EN

Stack Overflow用户

发布于 2011-10-13 20:36:25

例如,某种类型:

代码语言:javascript
运行
复制
>>> 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,我们看到:

代码语言:javascript
运行
复制
from zope.interface import Interface, Attribute

这解释了__module__的价值。从其他模块导入的类型的实例也会遇到问题。假设您创建了一个名为Attributeatt实例

代码语言:javascript
运行
复制
>>> att = Attribute('foo')
>>> print att.__module__
'zope.interface.interface'

同样,您正在学习类型来自何处,而不是定义变量的位置。

很可能不使用通配符导入的最大原因是您不知道您得到了什么,它们会污染您的命名空间,并可能会破坏其他类型/变量。

代码语言:javascript
运行
复制
>>> 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 *在没有冲突的情况下工作,也不能保证它不会在将来导入包的更新时发生。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7759290

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档