我有以下目录结构:
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
,而不导入stuff
为stuff
?< / 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
答案 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
?整个软件包无论如何都是词法分析器......)即使这样,这样的隐藏也排除了仅导入所需模块的性能优势,因为用户无法表明他们需要什么。