如何阻止Python' import'从导入文件名?

时间:2018-05-31 22:55:54

标签: python python-import

我有以下目录结构:

project/
  \__ module/
        \__ __init__.py
        \__ stuff.py


__init__.py文件如下所示:

from . import stuff as othername


但是,当我打开python交互式解释器并导入模块module,并在模块上调用dir()时,我得到以下结果:

>>> dir(module)
['__builtins__',
 '__cached__',
 ...
 'othername',
 'stuff']

如您所见,文件名stuff(减去.py扩展名)仍然存在。


如果不将stuff.py的名称更改为othername.py,我如何将stuff导入为othername,而不导入stuffstuff?< / p>


另外,在旁注中,为同一模块提供别名的最佳方法是什么?

这应该怎么做......

from . import stuff as othername
aliasname = othername

...还是有另一种方式被认为是&#34;正确的&#34;这样做的方法?


更新

我尝试在__all__文件中手动设置__init__.py,但文件名称仍包含在导入中。

__init__.py:

from . import stuff as othername
from . import stuff as aliasname

__all__ = [ 'othername', 'aliasname' ]


我设法让以下工作,但我不知道是否会考虑&#34;良好做法&#34;或者如果它甚至可以提供一致的行为:

__init__.py:

from . import stuff as othername
from . import stuff as aliasname

del stuff

1 个答案:

答案 0 :(得分:1)

您无法阻止以其真实姓名分配的模块。毕竟,以下内容必须在包模块对象上设置属性foo bar

# pkg/__init__.py
from .foo import bar

在添加之后,您可以del添加名称(import):

# pkg/__init__.py
from . import foo as bar
del foo

但请注意:它会导致像

这样的奇怪情况
>>> import pkg.foo
>>> from pkg.foo import a
>>> pkg.foo
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'pkg' has no attribute 'foo'
>>> import pkg.bar
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named 'pkg.bar'
>>> pkg.bar.a is a
True
>>> from pkg.bar import a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named 'pkg.bar'

当然,如果作为模块的pkg.bar状态被视为实现细节,那么这并不重要,因此没有人会发布{{1}像这些。如果您在不压缩真实姓名的情况下添加别名,那么这一点也很重要。 (在你的情况下,为什么不只调用import lex_c89.py?整个软件包无论如何都是词法分析器......)即使这样,这样的隐藏也排除了仅导入所需模块的性能优势,因为用户无法表明他们需要什么。