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

Python子模块干净导入实现及导入系统学习资源咨询

问题描述

目录结构

test.py
foo/__init__.py
foo/bar.py

bar.py 代码

def say_stuff():
    print("Stuff")

期望调用方式

在test.py中通过以下代码调用函数:

import foo
foo.bar.say_stuff()

遇到的错误

AttributeError: module 'foo' has no attribute 'bar'

现有修复方式的问题

修改foo/__init__.py为from .bar import *后,两种调用方式均可行:

foo.bar.say_stuff()
foo.say_stuff()

但需要仅保留foo.bar.say_stuff()这一种调用方式,避免子模块内容污染主模块命名空间,以获得干净的IDE自动补全。同时希望获取系统学习Python导入系统的资源。

解决方案

在foo/__init__.py中仅导入bar子模块本身,而非子模块内的成员:

from . import bar

等价写法:

import .bar as bar

这样操作后,foo模块会拥有bar属性(指向foo.bar子模块),但不会将bar.py中的say_stuff等成员直接导入到foo模块的命名空间中。此时只能通过foo.bar.say_stuff()调用目标函数,尝试foo.say_stuff()会抛出AttributeError,完全符合需求。

Python导入系统学习资源推荐
  • Python官方文档:模块章节:最权威的资料,详细覆盖模块定义、导入机制、包结构、相对/绝对导入、命名空间等核心内容,能帮你理解导入系统的底层逻辑,规避意外行为。
  • 《Fluent Python》:书中专门章节深入讲解Python模块与包的设计理念、导入细节,结合实际场景分析常见问题,适合进阶学习。
  • 《Python Cookbook(第三版)》:关于模块与包的章节提供大量实战解决方案,比如处理复杂包结构、避免导入循环、优化命名空间等,可解决实际开发中的导入难题。

内容的提问来源于stack exchange,提问作者Erysol

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 13:25:16