【问题标题】:Why are python imports renamed with leading underscores为什么python导入用前导下划线重命名
【发布时间】:2018-04-18 17:07:17
【问题描述】:

我注意到它与 functools.partial 以及 python 源代码本身一起工作。例如。以下来自collections.py

from operator import itemgetter as _itemgetter, eq as _eq
from keyword import iskeyword as _iskeyword
import sys as _sys
import heapq as _heapq

这样做的理由是什么?如果这是 C++,我知道它可能会导致命名空间冲突,但是在 python 中,这些名称不会是导入它们的模块的本地名称吗?除非有人确实导入 *,但不鼓励这样做,所以我不确定是不是这个原因。

【问题讨论】:

  • 这是一个约定,这意味着开发人员希望这些名称是私有的。告诉你你不应该在这个模块中使用它们,而应该从原始库中使用它们。
  • 但这就是问题所在,谁愿意使用这个模块中的 sys itemgetter?我在其他地方看到 sys 只是按原样导入而没有 _ 前缀例如svn.python.org/projects/python/trunk/Lib/BaseHTTPServer.py
  • 我认为这是编码风格的问题。但我同意这不是常见的做法,至少在 import 语句中是这样。

标签: python import rename


【解决方案1】:

这表示函数、变量或类是私有的。 它不仅是人类的约定(所以你应该知道不要使用它),而且 python 还强制它在某些条件下不会被导入。

来自PEP8

_single_leading_underscore:弱“内部使用”指标。例如。 from M import * 不会导入名称以下划线开头的对象。

PS:使用import * 不是好习惯,但这是另一个讨论。

【讨论】:

  • 谢谢。也许它很突出,因为在任何 python 书籍中我都没有看到 import sys 重命名为 _sys。由于 sys 模块随 python 安装一起提供,我很难理解谁想从这个模块中导入 sys(将它作为 _sys 导入)
  • @Tanager4 假设您正在运行import * from mymodule。您还有一个名为sym 的变量,但您输入错误sys。现在,因为 mymodule 暴露了sys,这将默默地成功并使用sys,而不是在定义错误之前抛出一个使用过的错误。一个人为的示例,但它说明了为什么您不想从模块中公开超出您需要的内容。当然,这也可以通过不使用import *,只导入你需要的东西来解决。
猜你喜欢
  • 2013-02-12
  • 2011-07-24
  • 1970-01-01
  • 2016-10-26
  • 2014-02-08
  • 2021-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多