我正在创建一些模块GUI
(描述图形界面),它需要另一个模块somecalc
(进行一些计算)。后者导入标准库:os
,sys
,time
等。
目标是最终建立一个包。
我找不到有关在包和/或其他自行开发的模块中导入其他子模块的约定:
没有混淆名称空间(以及Ipython中的自动完成):
somecalc.os
,somecalc.sys
,somecalc.time
,无需重新导入已在somecalc
import os as _os
中写somecalc.py
来解决问题#1,我也有两种方法可以做同样的事情。如果我在GUI
中执行以下测试:somecalc.os is os #TRUE
(import os
中的somecalc.py
)somecalc._os is os #TRUE
(来自import os as _os
中somecalc.py
的IPython无法自动完成无需对标准库进行繁琐的调用,例如:当我只能写somecalc.os.listdir
时写os.listdir
。此外,我不相信其他开发人员是否愿意与我合作。
我知道,一旦我想将我的文件夹变成一个包,我建议添加一个__init__.py
文件,包含我的所有导入。但是当我正在开发/调试我的子模块(使用if __name__ = '__main__'
下面的代码)时,将忽略根目录中的__init__.py
文件。此外,我仍然需要在import somecalc
文件的开头写GUI.py
。
有哪些惯例?
答案 0 :(得分:1)
在__init__.py
中,只展示您需要展示的内容。创建需要标准库的其他.py
,并导入您需要的内容。
$ tree GUI/
GUI
├── __init__.py
└── somecalc
├── __init__.py
├── somecalc.py
$ cat GUI/__init__.py
import somecalc
$ cat GUI/somecalc/__init__.py
from somecalc import get_time
$ cat GUI/somecalc/somecalc
import os
import sys
import time
def get_time():
return time.time()
这样,当您导入somecalc
时,您只会看到get_time
和somecalc
子模块:
$ python
Python 2.7.9 (default, May 20 2015, 15:38:28)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import GUI
>>> dir(GUI)
[..., 'somecalc']
>>> dir(GUI.somecalc)
[..., 'get_time', 'somecalc']
>>> dir(GUI.somecalc.somecalc)
[..., 'get_time', 'os', 'sys', 'time']
>>>