如何导入没有子导入的模块

时间:2018-05-31 13:32:33

标签: python python-3.x python-import python-module

我正在构建一个模块,但我很难理解哪种方法是避免工作空间污染的最佳做法。

示例代码

我的模块是:

aModule\
    __init__.py
    aSubModule.py
    someFunctions.py

文件内容为:

初始化的.py

from .someFunctions import function1, function2
from aModule import aSubModule

someFunctions.py

from numpy import exp,log,sqrt

def function1():
    print('function1: Hello World!')

def function2():
    print('function2: Hello ' + aUtilityFunction())

def aUtilityFunction(): #This should not be imported
    return 'World!'

aSubModule.py

from numpy import exp,log,sqrt

def function3():
    print('I am function 3')

def function4():
    print('I am function 4')

问题

做的时候

import aModule

我希望能够访问

aModule.function1()
aModule.function2()
aModule.aSubModule.function3()
aModule.aSubModule.function4()

但是我还有以下不需要的行为:

问题1

文件 someFunctions.py 作为子模块导入。换句话说,我可以从aModule.function1和aModule.someFunctions.function1访问function1。在我看来,这是凌乱的。 我发现的唯一解决方案是重命名文件_someFunctions.py。领先的下划线现在告诉Python不要导入它。这看起来很好,但我不确定这是否被视为良好做法。

问题2

函数exp,log和sqrt是在aModule.aSubModule下导入的。我想访问 aSubModule 里面的函数

aModule.aSubModule.function3()

但我想避免在aModule.aSubModule中使用exp,log和sqrt

这是因为在我正在努力的“真正的”子模块中,我只有3-4个与用户相关的功能,但超过10-15个进口。因此,当我尝试tab-complete

aModule.aSubModule.<tab>

弹出约20个条目,其中只有3-4个是相关的。

1 个答案:

答案 0 :(得分:0)

我找不到一个好方法,但黑客是可能的。诀窍是帮助系统不会使用以下划线开头的任何标识符,而不是 tab 自动完成,即使它是模块标识符。因此,为了避免自动访问不必要的标识符,您可以拥有包含私有模块

的包
aModule\
    __init__.py
    _someFunctions.py
    aSubModule\
        __init__.py
        _aSubModule.py

aModule __init__.py的内容:

from ._subFunctions import f1, f2
from . import aSubModule

aSubModule __init__.py的内容:

from ._aSubModule import f3, f4

我必须承认这是相当hacky而不是Pythonic。也许自定义导入程序会导致更清晰的代码,但我找不到importlib模块。

我的结论是,Pythonic方式可能不会试图隐藏通过模块导入的名称,而只是在当前名称空间中导入您需要的名称。