为什么相对导入如此限制?

时间:2018-05-03 16:56:50

标签: python python-3.x import module relative-path

使用目录:

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

我想象导入模块的目的是:

  1. 创建范围(或线程?)

  2. 在该范围内运行module.py

  3. from ..sub import module1对于test.py

    的顶级广告无效

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

    所以它可读,但不可导入。

    从类似于import moudule as *

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

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

    类会提供一个范围,同样调用类变量类似于调用模块变量。

    import module1 as cus

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

    功能exec(object[, globals[, locals]])object范围下运行globals,并将变量存储到locals。 (我猜)

    由于参数globalslocals都是类locals()的{​​{1}},所以它就像我想象的导入一样。

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

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

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

    修改

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

    这会给出你要求加载父包的行为吗?

    Module

1 个答案:

答案 0 :(得分:0)

相对导入不是目录遍历机制。 from ..a import b并不意味着“上一个目录,进入a目录,然后加载b.py”。这意味着“导入当前包的父包b子模块的a成员”。这通常看起来很像目录遍历会做什么,但它不一样,特别是对于涉及命名空间包,自定义模块加载器或sys.modules操作的情况。

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