模块名称与目录名称不同?

Dea*_*ado 14 python pythonpath

我们假设我有一个名为的python包bestpackage.

惯例规定,bestpacakge也可以是一个目录,sys.path其中包含一个 __init__.py使解释器假设可以从中导入的目录.

有什么办法可以为包名设置一个变量,这样可以将目录命名为与我导入它的指令不同的东西吗?有没有办法让namespacing不关心目录名称,而是尊重其他配置?

我的超级时尚客户端开发人员非常喜欢这些性感的something.otherthing.js项目名称,我们的一个较小的项目!

编辑:

为了澄清,我的问题的主要目的是允许我的客户端人员继续使用他们现有的约定(some.app.js)调用他们的"项目"(我们都添加到我们的路径中)目录中的目录,即使在某些情况下,它们实际上是python包,它们将在路径上并在import内部源自语句.我意识到这实际上是一件非常糟糕的事情,所以我出于好奇而要求更多.因此,这里的一个重大问题是规避了.目录名称(以及假定的包名称)意味着属性访问这一事实.这不能让我感到惊讶,这无法解决,我只是好奇是否有可能在导入背后的"魔法"更深层次.

这里有一些很好的响应,但都依赖于进行某种经典导入,其中属性访问器.将与目录名冲突.

Mar*_*ers 12

带有__init__.py文件的目录称为.

不,包名称始终与目录相同.这就是Python如何发现包,它将它与搜索路径上找到的目录名相匹配,如果__init__.py该目录中有一个文件,它找到了匹配项并导入了__init__.py包含的文件.

您始终可以使用from module import something或使用以下import module as alias语法在更简单易用的名称下将某些内容导入到本地模块命名空间中:

from something.otherthing.js import foo
from something.otherthing import js as bar
import something.otherthing.js as hamspam
Run Code Online (Sandbox Code Playgroud)


Use*_*ser 5

有一个解决方案需要一个初始导入某处

>>> import sys
>>> sys.modules['blinot_existing_blubb'] = sys
>>> import blinot_existing_blubb
>>> blinot_existing_blubb
<module 'sys' (built-in)>
Run Code Online (Sandbox Code Playgroud)

如果不更改导入机制,则无法从其他名称导入.我认为这是为了让Python更容易理解.

但是,如果您想要更改导入机制,我建议您:充分利用Python导入