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

时间:2013-12-24 08:53:55

标签: python namespaces

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

2 个答案:

答案 0 :(得分:9)

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

这里的要点是要明确导入模块(示例中为argparse使用导入的,但不会将它们作为它是自己的API - 即,您(作为API的客户)不应该依赖argparse.collections可用 - 如果您需要collections,则必须明确地导入它。

答案 1 :(得分:7)

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

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

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