如何阻止包内导入

How to block intra package imports

我正在构建一个 python 应用程序,我的代码库具有以下结构:

/utils
  /foo
/package_1
  /foo
/package_2
  /foo
/whatever

我想执行以下规则:

  1. utils 包中只能从 utils 包本身导入
  2. package_1 中可以从 utilspackage_1[= 导入31=]本身
  3. package_2 中可以从 utilspackage_2[= 导入31=]本身
  4. 任何你可以从所有其他包导入

我可以使用哪种自动策略来执行此编码规则?

AFAIK,您不能阻止某人导入在他的路径中找到的内容,但您可以修改路径以不包含您不希望访问的内容。我不推荐它,但它是可行的...

我会选择静态分析。也就是说,不要在运行时强制执行此操作。您可以将它与用于检查和测试代码的工具一起使用。

我的方法是调整来自 LibCST 项目的导入分析的范围示例,以强制执行您的导入要求。

https://libcst.readthedocs.io/en/latest/scope_tutorial.html

值得一试flake8-import-graph

如果你想要一些运行时检查,你可以编写一个自定义模块导入器。参见 import-hooks and an the examples