问题 为什么模块在另一个模块中作为_ 导入?


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

5377
2017-12-24 08:53


起源



答案:


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

这里的重点是要明确导入模块(argparse 在你的例子中) 使用 进口的  不会将它们作为自己的API的一部分公开 - 也就是说,您(作为API的客户)不应该依赖它们 argparse.collections 可用 - 如果你想要的话 collections,你必须明确地导入它。


6
2017-12-24 10:07





扩展arun的答案......

推理出现在 https://mail.python.org/pipermail/python-dev/2013-July/127286.html 是以下划线为前缀的名称被归类为“内部实现”,并且未来不会保证向后兼容性。这意味着你甚至发现自己正在使用 thing._otherThing 你知道你是在摇摇欲坠的理由,未来的更新。

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


5
2017-12-24 10:07