当前位置:  开发笔记 > 编程语言 > 正文

Python:包中的"私有"模块

如何解决《Python:包中的"私有"模块》经验,为你挑选了3个好方法。

我有一个封装mypack与模块mod_a,并mod_b在里面.我打算包装本身并mod_a自由进口:

import mypack
import mypack.mod_a

但是,我想保留mod_b专属用途mypack.那是因为它的存在仅仅是为了组织后者的内部代码.

我的第一个问题是,在Python编程中接受这样的"私有"模块是否可以接受?

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



1> Jeremy..:

我使用下划线为私有模块添加前缀,以将意图传达给用户.在你的情况下,这将是mypack._mod_b

这与PEP8的建议完全相同(但并不完全类似),当C-extension模块被Python模块包装时,它将C-extension模块命名为前导下划线; 即_socketsocket.


实际上,[PEP8](https://www.python.org/dev/peps/pep-0008/?#public-and-internal-interfaces)说:`即使适当地设置了__all__,内部接口(包,模块,类也是如此) ,函数,属性或其他名称)仍应以单个下划线作为前缀。

2> Frederick Th..:

我已经解决的解决方案是创建一个子包'private'并将我希望隐藏的所有模块放在那里.通过这种方式,它们可以保存起来,使mypack模块列表更清晰,更易于解析.

对我来说,这看起来也不是单调的.


感谢您的更新,并首先建议这种方法.我在"私有"子包名称前加上'z_',因此它在IDE代码完成下拉列表中显示为最后一个.我在子包的`__init __.py`中使用相对导入来仅公开"public"函数.在PyCharm和Jupyter中,为了保持内部模块的名称没有下拉,每个模块必须有一个与模块同名的函数,我必须在`__init __.py`中导入函数.你可能已经知道了这一切,但如果不是这样的话.如果您希望我扩展为答案,请告诉我.
是.我还在使用这种方法.没有找到更好的选择.

3> aterrel..:

虽然没有明确的私有关键字,但有一个惯例是将私有函数从单个下划线开始,但是双前导下划线将使其他人无法轻易地从模块外部调用该函数.请参阅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文件.


Aterrel,你的意思是"不包括在`__init __.py`"?是否意味着不要在`__init __.py`中放置语句`import mod_b`?如果是这样,那仍然无法解决我的问题.客户端仍然可以像公共模块一样导入`mod_b`:`import mypack.mod_b`.或者你的意思是什么?
推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有