gpt4 book ai didi

python - 为什么要限制从 python 包导入的类型?

转载 作者:行者123 更新时间:2023-11-28 22:05:29 26 4
gpt4 key购买 nike

当使用许多支持 Python 自动完成的 IDE 时,像这样的事情会显示警告,我觉得这很烦人:

from eventlet.green.httplib import BadStatusLine

当切换到:

from eventlet.green.httplib import *

警告消失了。将导入限制为您将使用的一组特定类型有什么好处?解析速度更快吗?减少碰撞?还有什么要点?似乎 Python IDE 的状态和类型系统的性质使得许多 IDE 很难完全正确地判断类型导入是否有效。

最佳答案

通过键入 from foo import *,您可以将 所有 foo 中定义的名称导入到全局 namespace 中。这是一种不好的做法,因为您可能会与其他模块和内置模块发生名称冲突。

例如,考虑一个模块 foo

#foo.py
def open(something):
pass

和一个模块bar:

#bar.py
def open(something_else):
pass

现在,from foo import * 隐藏了内置函数 open(),这意味着对 open() 的任何调用现在都引用foo.open() 而不是内置的。更糟糕的是,如果您随后拥有 from bar import *bar 中的函数 open() 现在会隐藏内置的 foo 导入的函数。

在上面的示例中,from foo import open 同样隐藏了内置函数,但是一看代码就会告诉您为什么不能再打开 IO 文件了。

这就是为什么您应该只导入特定的名称,确保您知道导入了哪些名称。或者,您可以使用完全限定的名称(import foo; foo.open(),这是非常安全的)。

编辑:请注意,如果您正在导入的模块还使用 from x import *,这可能会变得非常复杂。在这种情况下,您通常不仅将模块 foo 中的所有内容导入全局命名空间,而且还将模块 x 中的所有内容导入全局命名空间。这很快就会变成一团糟。

关于python - 为什么要限制从 python 包导入的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5204640/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com