为了账号安全,请及时绑定邮箱和手机立即绑定

如果我将脚本命名为“string.py”或“math.py”,“导入”操作的行为会有所不同。

如果我将脚本命名为“string.py”或“math.py”,“导入”操作的行为会有所不同。

繁星coding 2022-06-22 16:30:47
更新:情况1:同一文件夹中的文件:main.pystring.pymain.py中的代码:import stringstring.py中的代码:print('Hello!')运行main.py输出是:你好!案例二:同一文件夹中的文件:main.pymath.pymain.py中的代码:import mathmath.py中的代码:print('Hello!')运行main.py输出没什么...老问题:如果我将我的脚本命名为“string.py”并将其导入另一个脚本,它会与内置的“string”模块重叠如果我将我的脚本命名为“math.py”并将其导入另一个脚本,则内置的“数学”会与我自己的重叠使用内置模块等名称的脚本导入行为取决于我如何命名它们。一些受影响的模块名称:hashlib、string、calendar不影响的模块名称:math、cmath、os来自realpython.com:Python 要做的第一件事是在 sys.modules 中查找名称 abc。这是之前导入的所有模块的缓存。如果在模块缓存中找不到该名称,Python 将继续搜索内置模块列表。这些是 Python 预装的模块,可以在 Python 标准库中找到。如果在内置模块中仍未找到该名称,Python 然后在 sys.path 定义的目录列表中搜索它。来自 Michael Lutz 的“Learning Python”:粗略地说,Python 的模块搜索路径是由这些主要组件的串联组成的,其中一些是为您预设的,其中一些您可以定制以告诉 Python 在哪里查找:程序的主目录PYTHONPATH 目录(如果设置)标准库目录任何 .pth 文件的内容(如果存在)第三方扩展的站点包主页那么现在哪一个是正确的呢?
查看完整描述

2 回答

?
慕哥9229398

TA贡献1877条经验 获得超6个赞

math 和 string 的区别在于 math 是用 C 语言编写的,目的是提高速度,而 string 模块是用 Python 编写的,可以在 python lib 目录下找到。

因此,当您尝试导入字符串时,本地文件将覆盖全局字符串文件,但是当您尝试导入数学时,Python 不会搜索文件,因为它是内置在 Python 解释器中的。

您可以使用以下代码找到所有内置模块的列表:

import sys
print(sys.builtin_module_names)

如果您真的想覆盖数学模块,您可以通过更改sys.modules字典中的值来实现。


查看完整回答
反对 回复 2022-06-22
?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

我不相信@ZacharyaHaitin 的回答是正确的,而且我很确定如果凯伦真的看到了问题中描述的行为,那么肯定还有其他事情发生。


让我们来看一些例子......


覆盖string模块

我们有一个包含两个文件的空目录:


$ ls

main.py string.py

该文件main.py包含:


$ cat main.py

import string

该文件string.py包含:


$ cat math.py

print('hello')

当我们运行时main.py,我们看到:


$ python main.py

hello

覆盖math模块

如果我们对 执行相同的实验math,我们会看到相同的行为。这里是main.py:


$ cat main.py

import math

这是math.py:


$ cat math.py

print('hello')

当我们运行时main.py,我们看到的行为与我们在前面的示例中看到的相同:


$ python main.py

hello

上述示例与 Python2 和 Python3 的行为相同。在这两种情况下,都没有必要乱搞sys.modules。


这是一个将重现上述示例的脚本:


#!/bin/sh


echo "Overriding string module"


cat > main.py << EOF

import string

EOF


cat > string.py <<EOF

print('hello')

EOF


echo "main.py"

echo "-------"

cat main.py

echo


echo "string.py"

echo "---------"

echo

cat string.py

echo


echo "Running main.py..."

python main.py


cat <<EOF


======================================================================


EOF


echo "Overriding math module"


cat > main.py << EOF

import math

EOF


cat > math.py <<EOF

print('hello')

EOF


echo "main.py"

echo "-------"

cat main.py

echo


echo "math.py"

echo "---------"

echo

cat math.py

echo


echo "Running main.py..."

python main.py


查看完整回答
反对 回复 2022-06-22
  • 2 回答
  • 0 关注
  • 101 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信