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
,未来的更新。
这意味着这些模块会注意明确指出您不应该依赖它们导入的内容,因为这只是一个内部实现细节。