Как импортировать модуль без суб-импорта - PullRequest
0 голосов
/ 31 мая 2018

Я строю модуль, но у меня трудные времена, чтобы понять, как лучше всего избегать загрязнения рабочего пространства.

Пример кода

Мой модуль:

aModule\
    __init__.py
    aSubModule.py
    someFunctions.py

Содержимое файлов:

init .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 импортируется как подмодуль.Другими словами, я могу получить доступ к функции 1 как из aModule.function1, так и из aModule.someFunctions.function1.Это, на мой взгляд, грязно.Единственное решение, которое я нашел, - переименовать файл _someFunctions.py.Подчеркивание теперь говорит Python не импортировать его.Это выглядит хорошо, но я не уверен, считается ли это хорошей практикой.

Проблема 2

Функции exp, log и sqrt импортируются в aModule.aSubModule.Я хотел бы получить доступ к функциям внутри aSubModule , делая

aModule.aSubModule.function3()

, но я бы хотел избежать использования exp, log и sqrt внутри aModule.aSubModule

Это потому, чтовнутри «настоящего» подмодуля, над которым я работаю, у меня есть всего 3-4 функции, которые имеют отношение к пользователю, но более 10-15 импортов.Поэтому, когда я пытаюсь завершить табуляции

aModule.aSubModule.<tab>

, всплывают около 20 записей, из которых только 3-4 имеют отношение.

1 Ответ

0 голосов
/ 02 июня 2018

Я не мог найти хороший способ, но взломы возможны.Хитрость заключается в том, что любой идентификатор, начинающийся с подчеркивания, не будет использоваться справочной системой не для автозаполнения 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

Я должен признать, что это довольно хакерский и не очень Pythonic.Может быть, пользовательский импортер приведет к более чистому коду, но я не смог найти свой путь через модуль importlib.

Мой вывод таков, что Pythonic, вероятно, не пытается скрыть имена, импортированные через модуль,но просто импортируйте в текущее пространство имен нужные вам имена.

...