python - 关于 Python 导入的一些困惑

标签 python import module

我是 Python 的新手,有件事困扰了我很长一段时间。我在 Mark Lutz 的“学习 Python”中读到,当我们使用 from 语句导入模块中存在的名称时,它首先导入模块,然后为其分配一个新名称(即名称导入模块中存在的函数、类等),然后使用 del 语句删除模块对象。但是,如果我尝试使用 from 导入一个名称,该名称引用了本身未导入的导入模块中的名称,会发生什么情况?考虑以下示例,其中有两个模块 mod1.pymod2.py:

#mod1.py
from mod2 import test
test('mod1.py')        

#mod2.py
def countLines(name):
    print len(open(name).readlines())

def countChars(name):
    print len(open(name).read())

def test(name):
    print 'loading...'
    countLines(name)
    countChars(name)
    print '-'*10

现在看看当我运行或导入 mod1 时会发生什么:

>>>import mod1

loading...
3
44
----------

在这里,当我导入并运行test函数时,它运行成功,尽管我什至没有导入countCharscountLines,并且from 语句已经删除了 mod2 模块对象。

所以我基本上需要知道为什么这段代码可以工作,即使考虑到我提到的它不应该的问题。

编辑:非常感谢所有回答的人:)

最佳答案

每个函数都有一个 __globals__ 属性,该属性包含对搜索全局变量和函数的环境的引用。

test 函数然后链接到 mod2 的全局变量。因此,当它调用 countLines 时,解释器将始终找到正确的函数,即使您在导入该函数的模块中编写了一个同名的新函数也是如此。

关于python - 关于 Python 导入的一些困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11958121/

相关文章:

python - 从 Python 中的模块导入特定函数的要点

javascript - 使传单插件可作为导入或直接从 html header 使用

python - 如何在 Django 中为产品实现添加到愿望 list ?

Python:如何查看 Unix 时间戳是在一天中的某个时间之前还是之后

python - 如何向客户端发送服务器响应? (Python 套接字)

python - 如何从该类包含的类中导入类

python - 为什么我的包占用这么多内存

python - pyinstaller onefile 但仍然导入外部库(如果可用)

import - 无法从pycharm中的源目录导入模块

python - python中包 ‘random-state’中的 'KMeans'函数中的术语 'sklearn.cluster'是什么意思