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
相关产品推荐
相关产品推荐

