我有以下模块包组织
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
文件获得相同的结果,即如何仅导入 db
和User
以及不 user
。
注意:
user
是模块user.py
,User
是其中的类。
答案 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']