我正在构建一个模块,但是我遇到了一些困难--理解哪一个是避免工作空间污染的最佳实践。
示例代码
我的模块是:
aModule\
__init__.py
aSubModule.py
someFunctions.py这些文件的内容如下:
init.py
from .someFunctions import function1, function2
from aModule import aSubModulesomeFunctions.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访问aModule.function1。在我看来,这很混乱。我找到的唯一解决方案是重命名文件_someFunctions.py。前面的下划线现在告诉Python不要导入它。这看起来不错,但我不确定这是否被认为是好做法。
问题2
函数exp、log和sqrt是在aModule.aSubModule下导入的。我想访问aSubModule内部的函数
aModule.aSubModule.function3()但我希望避免在aModule.aSubModule中使用exp、log和sqrt。
这是因为在我正在工作的“真正”子模块中,我只有3-4个与用户相关的函数,但是有超过10-15个导入。因此,当我尝试在选项卡上完成时
aModule.aSubModule.<tab>大约有20个条目弹出,其中只有3-4个是相关的.
发布于 2018-06-02 08:40:57
我找不到好办法,但黑客是有可能的。诀窍是,任何以下划线开头的标识符都不会被帮助系统使用,而不是用于制表符自动完成,即使它是模块标识符。因此,为了避免自动访问不必要的标识符,您可以拥有包含私有模块的包。
aModule\
__init__.py
_someFunctions.py
aSubModule\
__init__.py
_aSubModule.pyaModule __init__.py含量
from ._subFunctions import f1, f2
from . import aSubModuleaSubModule __init__.py含量
from ._aSubModule import f3, f4我必须承认,这是相当讨厌,不太毕加索。也许自定义导入程序会导致代码更干净,但我无法找到通过importlib模块的方法。
我的结论是,Pythonic方法可能不是试图隐藏通过模块导入的名称,而是在当前名称空间中导入所需的名称。
https://stackoverflow.com/questions/50625578
复制相似问题