【问题标题】:python relative import not working as expectedpython相对导入没有按预期工作
【发布时间】:2015-12-25 13:47:48
【问题描述】:

我有以下模块包组织

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 文件实现相同的结果,即如何导入 dbUser user。 p>

注意:user 是模块 user.pyUser 是其中的类。

【问题讨论】:

标签: python-3.x flask sqlalchemy flask-sqlalchemy


【解决方案1】:

添加行:

__all__ = ['User', 'db']

__init__.py 的开头。

__all__from module import * 导入的名称列入白名单。

来自docs

模块现在可以控制在使用from module import * 时导入哪些名称,方法是定义一个包含将要导入的名称列表的__all__ 属性。一个常见的抱怨是,如果模块导入其他模块,例如 sys orstring, from moduleimport * 会将它们添加到导入模块的命名空间中。要解决此问题,只需在 __all__ 中列出公共名称:

# List public names
  __all__ = ['Database', 'open']

【讨论】:

    猜你喜欢
    • 2019-05-18
    • 2020-07-24
    • 2012-05-09
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-27
    相关资源
    最近更新 更多