Fre*_*ool 38 python python-module
我有一个封装mypack
与模块mod_a
,并mod_b
在里面.我打算包装本身并mod_a
自由进口:
import mypack
import mypack.mod_a
Run Code Online (Sandbox Code Playgroud)
但是,我想保留mod_b
专属用途mypack
.那是因为它的存在仅仅是为了组织后者的内部代码.
我的第一个问题是,在Python编程中接受这样的"私有"模块是否可以接受?
如果是,我的第二个问题是,向客户传达这一意图的最佳方式是什么?我是否在名称前加下划线(即_mod_b
)?或者声明一个子包private
并将所有这些模块放在那里是一个好主意吗?
Jer*_*emy 37
我使用下划线为私有模块添加前缀,以将意图传达给用户.在你的情况下,这将是mypack._mod_b
这与PEP8的建议完全相同(但并不完全类似),当C-extension模块被Python模块包装时,它将C-extension模块命名为前导下划线; 即_socket
和socket
.
Fre*_*ool 14
我已经解决的解决方案是创建一个子包'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.
Run Code Online (Sandbox Code Playgroud)
要使整个模块保密,请不要包含该__init__.py
文件.
在这种情况下需要注意的一件事是间接进口。如果在mypack
你
from mypack._mod_b import foo
foo()
Run Code Online (Sandbox Code Playgroud)
然后用户可以
from mypack import foo
foo()
Run Code Online (Sandbox Code Playgroud)
但仍然一无所知。我建议导入为
from mypack import _mod_b
_mod_b.foo()
Run Code Online (Sandbox Code Playgroud)
那么当用户尝试这样做时,他们会立即看到一个红旗
from mypack import _mod_b
Run Code Online (Sandbox Code Playgroud)
至于实际的目录结构,您甚至可以将 Jeremy 的答案扩展到一个_package_of_this_kind
包中,其中的任何内容都可以有您喜欢的任何“访问修饰符” - 用户会知道有龙
归档时间: |
|
查看次数: |
15861 次 |
最近记录: |