Python包中的“Private”模块

2024-04-28 17:27:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包mypack,里面有模块mod_amod_b。我希望包本身和mod_a可以自由导入:

import mypack
import mypack.mod_a

但是,我想保留mod_b作为mypack的专用。这是因为它的存在仅仅是为了组织后者的内部代码。

我的第一个问题是,在Python编程中,拥有这样的“私有”模块是一种公认的做法吗?

如果是,我的第二个问题是,向客户传达这一意图的最佳方式是什么?我是否在名称前加下划线(即_mod_b)?或者声明一个子包private并将所有这些模块放在那里是一个好主意吗?


Tags: 模块代码import名称mod声明客户编程
3条回答

我已经确定的解决方案是创建一个“私有”子包,并将我希望隐藏的所有模块放在其中。这样它们就可以被隐藏起来,使得mypack的模块列表更干净、更容易解析。

对我来说,这也不算不合理。

我在私有模块前面加上下划线,以便向用户传达意图。在您的情况下,这将是mypack._mod_b

这与PEP8建议在由Python模块包装时用前导下划线命名C扩展模块(即_socketsocket)的精神相同(但并不完全类似)。

虽然没有显式的私有关键字,但是有一个约定是将私有函数以一个下划线开头,但是一个双前导下划线将使其成为这样,其他人就不能从模块外部轻松调用该函数。请参阅PEP 8中的以下内容

- _single_leading_underscore: weak "internal use" indicator.  E.g. "from M
  import *" does not import objects whose name starts with an underscore.

- single_trailing_underscore_: used by convention to avoid conflicts with
  Python keyword, e.g.

  Tkinter.Toplevel(master, class_='ClassName')

- __double_leading_underscore: when naming a class attribute, invokes name
  mangling (inside class FooBar, __boo becomes _FooBar__boo; see below).

- __double_leading_and_trailing_underscore__: "magic" objects or
  attributes that live in user-controlled namespaces.  E.g. __init__,
  __import__ or __file__.  Never invent such names; only use them
  as documented.

要使整个模块成为私有模块,请不要包含它__init__.py文件。

相关问题 更多 >