为什么模块<name>在另一个模块中作为 _ 导入?



Python标准库中有几种情况,其中模块在其名称中带有前导下划线(_)导入。我想知道为什么这是必要的,因为它无论如何都在模块的名称下,并且from ... import *会尊重要导入的内容的__all__变量。

有谁知道为什么使用/需要这样做?

例如argparse它具有以下导入:

import collections as _collections
import copy as _copy
import os as _os
import re as _re
import sys as _sys
import textwrap as _textwrap

在 Python 中,单个前导下划线表示"这是一个实现细节,而不是 API 的一部分"。

这里的重点是要明确导入模块(在您的示例中argparse使用导入的模块,但不将它们公开为自己的 API 的一部分 - 即,您(作为 API 的客户端)不应依赖可用的argparse.collections - 如果你想collections,你必须显式导入它。

为了扩展 arun 的答案...

https://mail.python.org/pipermail/python-dev/2013-July/127286.html 中提出的推理是,以下划线为前缀的名称被归类为"内部实现",并且将来不保证向后兼容性。这意味着你甚至发现自己在使用你知道自己处于不稳定状态thing._otherThing,未来的更新。

这意味着这些模块会注意明确指出您不应该依赖它们导入的内容,因为这只是一个内部实现细节。

最新更新