Python 为什么可以';t模块访问属性在其包的_init__u; py.py中声明?

Python 为什么可以';t模块访问属性在其包的_init__u; py.py中声明?,python,module,packages,Python,Module,Packages,我有一个包结构,如下所示: mypackage __init__.py mymodule.py 我在\uuuu init\uuuu.py中添加了一些“常量”声明,例如: DELIMITER='\x01' testpackage __init__.py testmod.py 但是,mymodule.py中的代码无法访问分隔符,除非我添加: from __init__ import * 到mymodule.py文件的顶部。我想我错过了一个概念。是不是在\uuuu in

我有一个包结构,如下所示:

mypackage
  __init__.py
  mymodule.py
我在
\uuuu init\uuuu.py
中添加了一些“常量”声明,例如:

DELIMITER='\x01'
testpackage
    __init__.py
    testmod.py
但是,mymodule.py中的代码无法访问分隔符,除非我添加:

from __init__ import *

到mymodule.py文件的顶部。我想我错过了一个概念。是不是在
\uuuu init\uuuuu.py
中声明的内容在通过import语句访问之前不会被读入内存?此外,这是一种典型的放入
\uuu init\uuuuuuuy.py
文件的类型吗?

包不会以某种方式将其中的所有模块汇总在一起。除非您导入,
\uuuuu init\uuuu
中的内容,否则没有理由在其他模块中访问。

Python在导入包时运行
\uu init\uuuuy.py
中的代码,这允许进行一些初始化。但是,仅仅因为它是运行的,并不意味着您可以从其他模块中访问其中的变量

例如:

DELIMITER='\x01'
testpackage
    __init__.py
    testmod.py
假设
\uuuu init\uuuuuuuuupy
有代码
打印“初始化”\uuuuu init\uuuuuuuuu”
,而
testmod.py
打印“初始化testmod”
。在这种情况下,导入
testpackage
testmod
将导致运行初始化代码:

dynamic-oit-vapornet-c-499:test dgrtwo$ python -c "import testpackage"
Initializing __init__
dynamic-oit-vapornet-c-499:test dgrtwo$ python -c "from testpackage import testmod"
Initializing __init__
Initializing testmod

但是,它不允许
testmod.py
访问
\uuuu init\uuuu.py
中的变量。必须明确地执行此操作。

您从哪里得到的印象是,如果没有
import
语句,它就可以工作?@DavidRobinson:来自Python文档。我不知道除了假设init.py中的代码是由Python初始化之外,我还能如何解释他们在那里说的话。我现在明白了。你永远不知道什么是魔法,什么是魔法,除非你试过一次