我有一个封装mypack
与模块mod_a
,并mod_b
在里面.我打算包装本身并mod_a
自由进口:
import mypack import mypack.mod_a
但是,我想保留mod_b
专属用途mypack
.那是因为它的存在仅仅是为了组织后者的内部代码.
我的第一个问题是,在Python编程中接受这样的"私有"模块是否可以接受?
如果是,我的第二个问题是,向客户传达这一意图的最佳方式是什么?我是否在名称前加下划线(即_mod_b
)?或者声明一个子包private
并将所有这些模块放在那里是一个好主意吗?
我使用下划线为私有模块添加前缀,以将意图传达给用户.在你的情况下,这将是mypack._mod_b
这与PEP8的建议完全相同(但并不完全类似),当C-extension模块被Python模块包装时,它将C-extension模块命名为前导下划线; 即_socket
和socket
.
我已经解决的解决方案是创建一个子包'private'并将我希望隐藏的所有模块放在那里.通过这种方式,它们可以保存起来,使mypack
模块列表更清晰,更易于解析.
对我来说,这看起来也不是单调的.
虽然没有明确的私有关键字,但有一个惯例是将私有函数从单个下划线开始,但是双前导下划线将使其他人无法轻易地从模块外部调用该函数.请参阅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
文件.