You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python如何通过import *直接导入包内的类而非对应模块

问题原因

你遇到的报错和__init__.py的配置无关,核心有两个问题:

  1. Python语法明确禁止在函数、类等局部作用域中使用import *语法,只能在模块顶层(无缩进的全局位置)使用该语法,这是你抛出SyntaxError: import * only allowed at module level的直接原因。
  2. 你之前的认知有误:__all__变量不仅可以配置模块名,完全支持配置类、函数、全局变量等所有你想对外暴露的对象名称,你当前写的collections/__init__.py的导入和__all__配置逻辑本身是正确的。

标准实现方案

第一步:优化__init__.py导入(可选,避免导入冲突)

给模块导入加上相对导入标识.,避免和Python标准库的collections模块混淆:

# root/collections/__init__.py
from .collection1 import Collection1
from .collection2 import Collection2
from .collection3 import Collection3

__all__ = ['Collection1', 'Collection2', 'Collection3']

第二步:调整db.py的导入位置

把import *语句移到模块顶层即可:

# root/db.py
from root.collections import *

def test_collections():
   a = Collection1()
   b = Collection2()
   # 后续业务逻辑

test_collections()

特殊场景解决方案(函数内导入需求)

如果确实有必须在函数内部导入所有类的场景,可以通过importlib手动实现动态导入:

# root/db.py
import importlib

def test_collections():
    # 动态导入collections包
    collections_pkg = importlib.import_module('root.collections')
    # 遍历__all__把所有类注册到全局命名空间
    for cls_name in collections_pkg.__all__:
        globals()[cls_name] = getattr(collections_pkg, cls_name)
    
    a = Collection1()

test_collections()

注:该方案仅适合特殊动态场景,常规开发优先使用顶层导入的方案,可读性和性能更优

内容的提问来源于stack exchange,提问作者Wonseok the Great

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 06:06:01