Python如何处理来自;“其他地方”;
这可能是一个愚蠢的问题,但我不明白Python如何使用我们没有定义或导入的对象 考虑以下使用Python模块的示例:Python如何处理来自;“其他地方”;,python,object,memory,import,Python,Object,Memory,Import,这可能是一个愚蠢的问题,但我不明白Python如何使用我们没有定义或导入的对象 考虑以下使用Python模块的示例: from datetime导入日期 日期1=日期(2019,1,1) 日期2=日期(2019年1月5日) 类型(date2-date1)# 类型(日期2)# 然后date2-date1属于timedelta类,即使我们还没有导入它 (我可能还可以编写其他示例,在这些示例中,我们可以获取对象,尽管我们还没有定义它们。) 这怎么可能 我是否应该考虑这些新对象,它们只是作为内存中由其
from datetime导入日期
日期1=日期(2019,1,1)
日期2=日期(2019年1月5日)
类型(date2-date1)#
类型(日期2)#
然后date2-date1
属于timedelta
类,即使我们还没有导入它
(我可能还可以编写其他示例,在这些示例中,我们可以获取对象,尽管我们还没有定义它们。)
这怎么可能
我是否应该考虑这些新对象,它们只是作为内存中由其他函数返回的片段出现,即使我们没有定义它们,它们“本身”也包含足够的信息,以便Python解释器可以有意义地应用
type()
和其他函数?您错误地认为import
限制了加载到内存中的内容<代码>导入限制模块全局文件中绑定的名称
整个模块仍然被加载,该模块的依赖项也是如此。仅仅因为您的命名空间没有绑定对datetime.timedelta
对象的引用,并不意味着它对datetime
模块不可用
见:
来自表单的使用了稍微复杂一些的过程:
查找from
子句中指定的模块,必要时加载并初始化该模块李>
对于导入
条款中指定的每个标识符:
检查导入的模块是否具有该名称的属性
如果没有,请尝试导入具有该名称的子模块,然后再次检查导入的模块是否具有该属性
如果未找到该属性,将引发ImportError
否则,对该值的引用将存储在本地命名空间中,如果存在,则使用as子句中的名称,否则使用属性名称
因此,模块的加载和初始化是一个单独的步骤,每个模块执行一次。第二步绑定命名空间中的名称
from datetime import date
确保加载了datetime
模块,然后查找datetime.date
并将date=datetime.date
添加到命名空间中
如果要查看加载了哪些模块,请查看。这是要查看给定模块是否已加载的位置
from datetime import date
Date正在某处导入timedelta,因为它可能是一个依赖项,即使您没有看到它。谢谢!SE仍然让我等了9分钟,直到我能接受你的答案:)但与此同时,为了好玩,让我问:是否有可能通过某种方式诱使我的代码定义一个对象,将其存储在某个地方,然后用另一个Python脚本加载它,因此,我实际上在运行时得到了一个在Python脚本前面没有定义的对象?类似于import datetime
,date=datetime.date
,del datetime
@Ayxan啊,但是我失去了对我的对象的引用。我希望仍然能够引用它,但对象没有在前面定义,只是占用了我内存中的某个区域(我不确定我所问的是否有意义,我只是试图将我对Python解释器内部工作的模糊理解形式化)。@Ayxan:sorta不是真的,因为这必须假设名称datetime
尚未绑定到其他内容date=\uu导入('datetime',fromlist=['date'])。date
更近了。@G.Anderson:这是纯Python实现,在绝大多数安装中,所有这些名称都被来自{u datetime import*
的进一步删除,以加载,其中调用创建timedelta
实例。+1。你知道当我导入一个给定的模块时,有没有办法突出显示所有导入的依赖项?@l7ll7:这比你想象的要复杂得多。您可以快照sys.modules
(这只会给您提供尚未加载的依赖项)或将bltins.\uuuuu import\uuuuuu
替换为跟踪导入内容的包装函数(但不会跟踪加载更多模块的扩展模块)。@MartijnPieters哇,好的,我会将其保存到稍后的SE问题中,当我对Python了解更多的时候。。。
from datetime import date