导入其他子模块&忽略标准库

时间:2016-04-26 13:20:33

标签: python python-3.x

我正在创建一些模块GUI(描述图形界面),它需要另一个模块somecalc(进行一些计算)。后者导入标准库:ossystime等。

目标是最终建立一个包。

我找不到有关在包和/或其他自行开发的模块中导入其他子模块的约定:

  1. 没有混淆名称空间(以及Ipython中的自动完成):

    • 我不希望看到somecalc.ossomecalc.syssomecalc.time
  2. ,无需重新导入已在somecalc

    中导入的标准库
    • 即使我在import os as _os中写somecalc.py来解决问题#1,我也有两种方法可以做同样的事情。如果我在GUI中执行以下测试:
    • somecalc.os is os #TRUEimport os中的somecalc.py
    • somecalc._os is os #TRUE(来自import os as _ossomecalc.py的IPython无法自动完成
  3. 无需对标准库进行繁琐的调用,例如:当我只能写somecalc.os.listdir时写os.listdir。此外,我不相信其他开发人员是否愿意与我合作。

  4. 我知道,一旦我想将我的文件夹变成一个包,我建议添加一个__init__.py文件,包含我的所有导入。但是当我正在开发/调试我的子模块(使用if __name__ = '__main__'下面的代码)时,将忽略根目录中的__init__.py文件。此外,我仍然需要在import somecalc文件的开头写GUI.py

    有哪些惯例?

1 个答案:

答案 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_timesomecalc子模块:

$ 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']
>>>