创建命名空间 |在文件级别扩展名称树

Create namespace | Extend name tree at file level

提问人:MPEI_stud 提问时间:7/25/2023 最后编辑:MPEI_stud 更新时间:7/25/2023 访问量:27

问:

例如,我们可以将C++

namespace MilkyWay{
    namespace AlphaCentauri {
        int Planets = 4;
    }
    namespace SolarSys {
        int Planets = 8;
    }
}

然后将其用作MilkyWay::SolarSys::Planets

有没有办法写出类似 in 的东西?或者换句话说,是否有可能不仅在文件夹嵌套级别,而且在单个文件级别扩展名称树?namespaceC++

或者,假设我们有以下结构:

sound/                          Top-level package
  __init__.py               Initialize the sound package
  formats/                  Subpackage for file format conversions
          __init__.py
          wavread.py
          wavwrite.py
          ...
  effects/                  Subpackage for sound effects
          __init__.py
          echo.py
          surround.py
          ...
  filters/                  Subpackage for filters
          __init__.py
          equalizer.py
          vocoder.py
          ...

我能做到,但为什么我做不到?from sound.formats import wavreadfrom sound import formats

命名空间 python-packaging

评论

0赞 AIPAL18 7/25/2023
我认为这将帮助您:python包
0赞 deceze 7/25/2023
“为什么我不能从声音导入格式?”— 但你可以!?
0赞 deceze 7/25/2023
不,类似 C++ 的命名空间在 Python 中不存在。现有的组织机制(文件夹/文件/类)通常完全足够,就我个人而言,我从未觉得需要更多的东西。
0赞 MPEI_stud 7/25/2023
@deceze我可以,但随后提出:.而;工作正常formats.wavread.do_smth()AttributeError: module 'formats' has no attribute 'wavread'from sound.formats import wavreadwavread.do_smth()
0赞 deceze 7/25/2023
是的,基本上只是加载,而不是该文件夹中的每个文件。这里典型的习惯是用 inside that 重新导出模块,所以它确实成为模块的一个属性。from sound import formatssound/formats/__init__.pyfrom . import wavread__init__.py

答:

1赞 MPEI_stud 7/25/2023 #1

好的,我的问题类似于在 Python 中导入包

这笔交易是

但是,找到包目录后,它不会扫描该目录并自动导入所有 .py 文件。

因此,要完成这项工作,我们需要添加到所需的子模块(文件)中,以便 python 导入它。__init__.py.py

例如,文件必须包含sound/formats/__init__.py

from . import wavread, wavwrite

现在

from sound import formats

formats.wavread.do_smth()

会正常工作

感谢@deceze