为什么相对进口如此限制?
Why relative import so restrict?
有目录:
app/
sub1/
__init__.py
module1.py
sub2/
__init__.py
test.py
我想象导入一个模块要做的是:
创建作用域(或线程?)
运行 module.py 在那个范围内
from ..sub import module1
在 test.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
。 (我猜)
因为参数 globals
和 locals
都是 class Module
的 locals()
,这就像我想象的 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
根本不被视为一个包。
有目录:
app/
sub1/
__init__.py
module1.py
sub2/
__init__.py
test.py
我想象导入一个模块要做的是:
创建作用域(或线程?)
运行 module.py 在那个范围内
from ..sub import module1
在 test.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
。 (我猜)
因为参数 globals
和 locals
都是 class Module
的 locals()
,这就像我想象的 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
根本不被视为一个包。