蟒蛇相对进口未正常工作
问题描述:
我有以下几个模块封装组织蟒蛇相对进口未正常工作
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
也在列表中,而我明确在__init__.py
内部做了from .user import User
。
我无法理解这种行为,因为如果我简单地做
>>> from models.user import User
>>> dir()
['User', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__']
我只得到User
。
如何实现与__init__.py
文件,即相同的结果如何导入仅db
和User
和不user
。
注:
user
是模块user.py
和User
是里面的类。
答
添加一行:
__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']
不要'进口*'。它将导入模块公用名称空间内的所有内容。 – dirn
@dirn我知道,但'user'不在模块的公共名称空间内,对吗? –
[Imports中导入的\ _ \ _ init \ _ \ _。py的行为有所不同](http://stackoverflow.com/questions/34434749/imports-behave-differently-when-in-init-py - 即,是进口) –