Python 3.x python相对导入未按预期工作
我有以下模块包组织Python 3.x python相对导入未按预期工作,python-3.x,flask,sqlalchemy,flask-sqlalchemy,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 以下是我的\uuuu init\uuuu.py的内容: from flask_sqlalchemy import SQLAlchemy db = SQL
models
├── __init__.py
├── __pycache__
│ ├── __init__.cpython-34.pyc
│ ├── model.cpython-34.pyc
│ └── user.cpython-34.pyc
└── user.py
1 directory, 5 files
以下是我的\uuuu init\uuuu.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
也在列表中,而我在\uuuu init\uuuu.py
中显式地从.user导入user
我无法理解这种行为,因为如果我只是这么做
>>> from models.user import User
>>> dir()
['User', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__']
I仅获取用户
如何使用\uuuu init\uuuuu.py
文件实现相同的结果,即如何仅导入db
和用户
,而不导入用户
注意:user
是模块user.py
,user
是其中的类
添加行:
__all__ = ['User', 'db']
在\uuuu init\uuuuuy.py
的开头
\uuuu all\uuuu
白名单将由从模块导入*
导入的名称
从:
模块现在可以通过定义包含将要导入的名称列表的\uuuu all\uuuuu
属性,控制在使用from module import*
时导入哪些名称。一个常见的抱怨是,如果模块导入其他模块,例如sys或string,则来自模块的import*会将它们添加到导入模块的命名空间中。要解决此问题,只需在\uuuu all\uuu
中列出公共名称:
# List public names
__all__ = ['Database', 'open']
不要导入*
。它将导入模块的公共名称空间内的所有内容。@dirn我知道,但是user
不在模块的公共名称空间内,对吗?可能是