gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:23:19 25 4
gpt4 key购买 nike

我有以下目录结构:

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


另外,顺便说一句,为同一模块提供别名的最佳方法是什么?

这是应该如何完成的...

from . import stuff as othername
aliasname = othername

...或者还有另一种被认为是“正确”的方法吗?


更新

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

__init__.py:

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

__all__ = [ 'othername', 'aliasname' ]


我已经设法使以下内容发挥作用,但我不知道它是否会被视为“良好实践”,或者它是否会提供一致的行为:

__init__.py:

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

del stuff

最佳答案

您无法阻止以真实名称分配模块。毕竟下面要设置属性foo bar在包模块对象上:

# pkg/__init__.py
from .foo import bar

你当然可以 del添加后的名称(通过import ing它):

# 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状态,这并不重要。因为模块被视为实现细节,因此没有人会发出 import像这些。如果您添加别名而不隐藏真实姓名,那么它也就不那么重要了。 (在你的例子中,为什么不直接调用 lex_c89.py c89.py ?整个包都是一个词法分析器......)即使如此,这种隐藏也会妨碍仅导入所需模块的性能优势,因为用户无法指示他们需要什么。

关于python - 如何阻止 Python 'import' 导入文件名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50633897/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com