2015-12-25 56 views
1

我有以下幾個模塊封裝組織蟒蛇相對進口未正常工作

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 - 即,是進口) –

回答

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