Python import 导入模块的时候为什么引用不了子模块?

本文探讨了结巴分词(jieba)在Python中的正确导入与使用方法,解释了为何不能直接通过母模块调用子模块,并提供了正确的导入示例。深入解析了Python模块导入机制及命名空间污染问题。

问题描述

比如导入结巴分词,代码如下:

import jieba # 引入母模块

然后直接使用结巴的子模块 posseg 来标注词性,代码如下:

jieba.posseg.cut('中文词性标注')

这句报异常

AttributeError: 'module' object has no attribute 'posseg'

必须这样导入子模块,才能使用:

from jieba import posseg
posseg.cut('中文词性标注') # 这句正常调用

看到常说推荐直接导入母模块,以防止命名空间污染;而且一般如:

from a import b
b.func('中文词性标注')

这样格式的代码,都能转为这样来使用:

import a
a.b.func('中文词性标注')

但为什么 jieba 结巴分词却不能这样呢?这是什么原因呢?

原因

如果 a 是个目录, b 是个 b.py 文件, func 是 b.py 里的函数, a 目录里有空的 __init__.py

import a # 没问题
import a.b # 没问题,会在这一句找 a/b.py
result = a.b.func() # 正常

重来一遍:

import a # 没问题
result = a.b.func() # 不行, a 下面并没有 b
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值