首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何导入没有子导入的模块

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

Stack Overflow用户
提问于 2018-05-31 13:32:32
回答 1查看 1.4K关注 0票数 2

我正在构建一个模块,但是我遇到了一些困难--理解哪一个是避免工作空间污染的最佳实践。

示例代码

我的模块是:

代码语言:javascript
复制
aModule\
    __init__.py
    aSubModule.py
    someFunctions.py

这些文件的内容如下:

init.py

代码语言:javascript
复制
from .someFunctions import function1, function2
from aModule import aSubModule

someFunctions.py

代码语言:javascript
复制
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

代码语言:javascript
复制
from numpy import exp,log,sqrt

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

问题所在

做的时候

代码语言:javascript
复制
import aModule

我想能

代码语言:javascript
复制
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内部的函数

代码语言:javascript
复制
aModule.aSubModule.function3()

但我希望避免在aModule.aSubModule中使用exp、log和sqrt。

这是因为在我正在工作的“真正”子模块中,我只有3-4个与用户相关的函数,但是有超过10-15个导入。因此,当我尝试在选项卡上完成时

代码语言:javascript
复制
aModule.aSubModule.<tab>

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-02 08:40:57

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

代码语言:javascript
复制
aModule\
    __init__.py
    _someFunctions.py
    aSubModule\
        __init__.py
        _aSubModule.py

aModule __init__.py含量

代码语言:javascript
复制
from ._subFunctions import f1, f2
from . import aSubModule

aSubModule __init__.py含量

代码语言:javascript
复制
from ._aSubModule import f3, f4

我必须承认,这是相当讨厌,不太毕加索。也许自定义导入程序会导致代码更干净,但我无法找到通过importlib模块的方法。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50625578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档