python: импорт модуля в пространство имен пакета

Интересно, есть ли какой-то стандартный способ сделать что-то вроде

import scipy as sp
from scipy import interpolate as sp.interpolate

это не разрешено.

Конкретно:

  1. Я хотел бы знать, есть ли какая-то причина, по которой вышеперечисленное не разрешено. Если я разрабатываю свой собственный пакет foo, кажется разумным как можно меньше загрязнять его пространство имен.

  2. Вещи как

    import scipy as sp
    __import__('scipy.interpolate')
    

    делают свою работу, но не все так хорошо, и документы рекомендуют не использовать __import__, если только это не обязательно. Сходным образом

    import importlib
    import scipy as sp
    importlib.import_module('scipy.interpolate',sp)
    

делает свою работу, но она все еще уродлива, еще длиннее и помещает importlib в пространство имен...


person user2340231    schedule 17.10.2013    source источник
comment
Я не думаю, что это загрязняет пространство имен для использования import scipy as sp см. programmers.stackexchange.com/questions/187403/   -  person rtrwalker    schedule 17.10.2013
comment
Это не import scipy as sp, а многие import scipy.xxx, которые впоследствии используются для импорта интегрирующих, интерполирующих, сигнальных и... подмодулей scipy. Я бы хотел, чтобы они все были под sp   -  person user2340231    schedule 17.10.2013


Ответы (1)


Импортированные модули обрабатываются как обычные объекты, поэтому, если вы действительно хотите, вы можете импортировать модуль и назначить его произвольной переменной, например

import scipy as sp
from scipy import interpolate 
sp.interpolate = interpolate

sp.interpolate будет вести себя так, как ожидалось, он просто указывает на модуль интерполяции всякий раз, когда вы вызываете sp.interpolate. Это один и тот же объект внизу, т.е.

print sp.interpolate is interpolate
>>> True

Затем, чтобы окончательно удалить исходный вызов указателя «интерполировать»

del interpolate
person Ashok Fernandez    schedule 17.10.2013
comment
а потом del interpolate я полагаю. Причина, по которой я хотел бы сделать это, состоит в том, чтобы не допустить, чтобы IDE сбивали с толку пользователей. Если я сделаю свой модуль foo, когда люди работают с foo в обычных IDE Python, ввод foo. запускает автозаполнение со всем, что там есть. И мне не нравятся все модули scipy, которые я использую для отображения. В частности, я не люблю, когда неопытные пользователи задаются вопросом, действительно ли interpolate, который они видят как foo.interpolate, является частью foo или нет. Похоже, что большинство IDE не смотрят на __all__ и автоматически раскрывают только официальный интерфейс пакета. - person user2340231; 17.10.2013
comment
Да, если вы хотите полностью избавиться от указателя интерполяции, используйте del interpolate, и модуль интерполяции будет доступен только через определенный вами указатель sp.interpolate. - person Ashok Fernandez; 17.10.2013
comment
Я отредактировал свой ответ и добавил удаление исходного указателя интерполяции. Если это отвечает на ваш вопрос, отметьте его как правильный. - person Ashok Fernandez; 17.10.2013