【发布时间】:2018-12-17 09:53:33
【问题描述】:
我做了一个测试,用我自己的遮蔽 Python 的内置字符串模块
名为“字符串”的模块,用于测试模块搜索路径行为。我的习惯
字符串脚本只有 print('string' * 2) 的内容。它是
位于当前目录,如下代码所示。
Python 3.6.4 |Anaconda custom (64-bit)| (default, Jan 16 2018, 10:22:32) [MSC v.1900 64 bit (AMD64)]
Type 'copyright', 'credits' or 'license' for more information
IPython 6.2.1 -- An enhanced Interactive Python. Type '?' for help.
In [1]: %pwd
Out[1]: 'C:\\Users\\stephen'
In [2]: import string
In [3]: string
Out[3]: <module 'string' from 'C:\\ProgramData\\Anaconda3\\lib\\string.py'>
In [4]: import imp
In [5]: imp.reload(string)
stringstring
Out[5]: <module 'string' from 'C:\\Users\\stephen\\string.py'>
关于 IPython 中 reload 的三个问题:
- 为什么reload 认为它实际导入的模块(本地string.py)已经被导入了?是否只是文件的相同性 姓名?
- 为什么重新加载导入的模块与已导入的模块不同?它是否跳过了 sys.modules 字典的检查,这是 在原始导入期间首先检查?
- 为什么 reload/IPython/Python 不知道它在这里拉了一个快速的模块,将一个模块切换到另一个模块?
编辑:在来回尝试处理 Stack Overflow 抱怨我的代码块时,我无意中丢失了一些我想说的话。以下是我能记住的: IPython 在启动时将内置字符串模块添加到 sys.modules 字典(在 sys.path 之前搜索 sys.modules),这是常规 Python 交互式提示符所不具备的。所以我从交互式提示与 IPython 中得到了不同的行为。通过交互式提示,我总是得到本地的 string.py,因为 sys.path 从当前目录开始进行模块搜索。所以,我对常规交互(Anaconda)和 IPython 之间的区别了解了这么多。我列出的问题让我感到困惑。
【问题讨论】:
-
我会避免使用已经存在的模块名称。这很容易引起问题。
-
@JackMoody 是的,当然。通常,我不会为自己的模块使用这样的名称。这只是一个旨在更好地探索和理解这种冲突的练习。现在我试图了解我没想到的结果。
标签: python python-3.x import ipython reload