python相对导入不按预期工作

时间:2015-12-25 13:47:48

标签: python-3.x flask sqlalchemy flask-sqlalchemy

我有以下模块包组织

models
├── __init__.py
├── __pycache__
│   ├── __init__.cpython-34.pyc
│   ├── model.cpython-34.pyc
│   └── user.cpython-34.pyc
└── user.py

1 directory, 5 files

以下是我的__init__.py

的内容
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

from .user import User

正在运行

>>> from models import *
>>> dir()
['SQLAlchemy', 'User', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'db', 'user']
  

请注意user也在列表中,而我在from .user import User内明确地__init__.py

我无法理解这种行为,因为如果我只是做

>>> from models.user import User
>>> dir()
['User', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__']

获取User

如何使用__init__.py文件获得相同的结果,即如何仅导入 dbUser以及 user

  

注意:user是模块user.pyUser是其中的类。

1 个答案:

答案 0 :(得分:2)

添加以下行:

__all__ = ['User', 'db']

__init__.py

的开头

__all__from module import *导入的名称列入白名单。

来自docs

  

模块现在可以通过定义包含将要导入的名称列表的from module import *属性来控制在使用__all__时导入的名称。一个常见的抱怨是,如果模块导入其他模块,例如sys or字符串, from module,则import *会将它们添加到导入模块的命名空间中。要解决此问题,只需在__all__中列出公共名称:

# List public names
  __all__ = ['Database', 'open']