为什么不能在其包的__init__.py中声明模块访问属性?

Sam*_*erg 6 python module packages

我有一个包结构如下:

mypackage
  __init__.py
  mymodule.py
Run Code Online (Sandbox Code Playgroud)

我把一些"常量"声明放在__init__.py例如:

DELIMITER='\x01'
Run Code Online (Sandbox Code Playgroud)

但是,mymodule.py中的代码无法访问DELIMITER,除非我添加:

from __init__ import *
Run Code Online (Sandbox Code Playgroud)

mymodule.py文件的顶部.我想我在这里错过了一个概念.是什么声明的内容在__init__.py通过import语句访问之前不会被读入内存?另外,这是放入__init__.py文件的典型类型吗?

Dav*_*son 5

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

例如:

testpackage
    __init__.py
    testmod.py
Run Code Online (Sandbox Code Playgroud)

让我们说__init__.py有代码print "Initializing __init__",并且testmod.pyprint "Initializing testmod".在这种情况下,导入testpackagetestmod将导致初始化代码运行:

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
Run Code Online (Sandbox Code Playgroud)

但是,它不允许testmod.py访问变量__init__.py.这必须明确地完成.