【问题标题】:Python namespace 'import X' and 'from X import'Python 命名空间“导入 X”和“从 X 导入”
【发布时间】:2016-08-29 05:22:15
【问题描述】:
以下代码有效:
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
但是,以下内容:
import sqlalchemy
Base = sqlalchemy.ext.declarative.declarative_base()
抛出:module 'sqlalchemy' has no attribute 'ext'。怎么可能?
【问题讨论】:
标签:
python
python-3.x
sqlalchemy
namespaces
【解决方案1】:
sqlalchemy 是一个包,导入一个包不会自动加载它的子模块。当你这样做时
import sqlalchemy
Base = sqlalchemy.ext.declarative.declarative_base()
导入系统不会加载sqlalchemy.ext 子模块,因为您没有要求它。
当你这样做时
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
您已明确要求加载 sqlalchemy.ext 和 sqlalchemy.ext.declarative,因此访问有效。
你也可以这样做
import sqlalchemy.ext.declarative
Base = sqlalchemy.ext.declarative.declarative_base()
这也会加载sqlalchemy.ext 和sqlalchemy.ext.declarative。
有些包会自动在它们的__init__.py 中加载它们的子模块,所以你不必显式地导入子模块。不过,这不是您应该依赖的东西。