2013-10-17 100 views
1

导入模块,我不知道是否有做类似蟒蛇:在包命名空间

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) 
    

做工作,但它仍然是丑陋的,甚至更长的时间,并把导入库命名空间中的...

+0

我不认为它污染了命名空间来使用'进口SciPy的作为sp'看http://programmers.stackexchange.com/questions/187403/import-module-vs-from-module-import-function – rtrwalker

+0

这不是'导入scipy sp',而是许多导入scipy.xxx,随后使用导入scipy的积分,插值,信号,...子模块。我想把它们都放在'sp' – user2340231

回答

0

导入模块像对待普通对象,所以如果你真的想你可以导入一个模块,并将其分配到任意变量,像这样

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

sp.interpolate会像预期的那样,它只是指向每当调用sp.interpolate的内插模块。他们是同一个对象的下方,即

print sp.interpolate is interpolate 
>>> True 

然后到最后删除原来的“插值”指针调用

del interpolate 
+1

之下,然后我想'del interpolate'。我想这样做的原因实际上是为了防止IDE混淆用户。如果我让我的模块成为foo,当人们在普通的python IDE中使用foo时,输入'foo.'就会启动自动完成任何内容。我不喜欢我用来显示的所有scipy模块。特别是,我不喜欢不熟练的用户想知道他们看作'foo.interpolate'的'interpolate'是否实际上是foo的一部分。大多数IDE似乎不会查看'__all__'并且只能自动扩展官方软件包界面。 – user2340231

+0

是的,如果你想完全摆脱内插指针,那么使用'del interpolate',内插模块将只能通过你定义的'sp.interpolate'指针来使用。 –

+0

我编辑了我的答案并添加了原始插值指针的删除。如果这回答你的问题,请将其标记为正确。 –