为什么相对进口如此限制?

Why relative import so restrict?

有目录:

app/
    sub1/
        __init__.py
        module1.py
    sub2/
        __init__.py
        test.py

我想象导入一个模块要做的是:

  1. 创建作用域(或线程?)

  2. 运行 module.py 在那个范围内

from ..sub import module1test.py

的顶级无效

但是open('../sub1/module1.py', 'r')有效!!

因此它是可读的,但不可导入。

从类似于 import moudule as *

的内容开始
exec(open('../sub1/module1.py', 'r').read())

通过在特定范围内执行此脚本并为该范围命名来进一步执行此操作。

class 会提供一个作用域,调用 class 变量类似于调用模块变量。

import module1 as cus

class Module:
    exec(open('../sub1/module1.py', 'r').read(), locals(), locals())
cus = Mudule()
cus.function_inside_module1()

globals作用域下函数exec(object[, globals[, locals]])运行object,并将变量存入locals。 (我猜)

因为参数 globalslocals 都是 class Modulelocals(),这就像我想象的 import 要做的。

如果这个工作正常,我猜模块下的模块可以写成嵌套的class。

这个奇怪的导入会导致什么样的问题?

如果不是,为什么文件可读但不可导入(有顶级限制)?

编辑

@user2357112 抱歉我不知道怎么写多行注释:

这会提供您要求加载父包的行为吗?

class sub1:
    exec(open('../sub1/__init__.py', 'r').read(), locals(), locals())
    class Module:
        exec(open('../sub1/module1.py', 'r').read(), locals(), locals())
cus = sub1.Module()
del sub1

相对导入不是目录遍历机制。 from ..a import b 并不代表 "go up a directory, enter the a directory, and load b.py"。意思是"import the b member of the a submodule of the current package's parent package"。这通常看起来很像目录遍历所做的事情,但它并不相同,特别是对于涉及命名空间包、自定义模块加载器或 sys.modules 操作的情况。

sub2 没有父包。尝试引用不存在的父包是错误的。此外,如果您直接按文件名 运行 test.py,则 sub2 根本不被视为一个包。