蟒蛇相对进口未正常工作

问题描述:

我有以下几个模块封装组织蟒蛇相对进口未正常工作

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文件,即相同的结果如何导入dbUseruser

注:user是模块user.pyUser是里面的类。

+0

不要'进口*'。它将导入模块公用名称空间内的所有内容。 – dirn

+0

@dirn我知道,但'user'不在模块的公共名称空间内,对吗? –

+0

[Imports中导入的\ _ \ _ init \ _ \ _。py的行为有所不同](http://stackoverflow.com/questions/34434749/imports-behave-differently-when-in-init-py - 即,是进口) –

添加一行:

__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']