我正在构建一个模块,但我很难理解哪种方法是避免工作空间污染的最佳做法。
我的模块是:
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()
但是我还有以下不需要的行为:
文件 someFunctions.py 作为子模块导入。换句话说,我可以从aModule.function1和aModule.someFunctions.function1访问function1。在我看来,这是凌乱的。 我发现的唯一解决方案是重命名文件_someFunctions.py。领先的下划线现在告诉Python不要导入它。这看起来很好,但我不确定这是否被视为良好做法。
函数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个是相关的。
答案 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方式可能不会试图隐藏通过模块导入的名称,而只是在当前名称空间中导入您需要的名称。