导入 Python 模块的具体性?

2 投票
1 回答
1836 浏览
提问于 2025-04-18 17:04

我一直在使用Python的PySerial库Pyserial API,但是我不太明白为什么我必须特别导入这个模块的某个部分。

如果我这样做,就会出错:

import serial
for item in serial.tools.list_ports.comports():
    print item

上面的代码会返回“AttributeError: type object 'Serial' has no attribute 'tools'”,意思是找不到'tools'这个属性。

如果我特别导入那个属性,就不会出错:

import serial.tools.list_ports
for item in serial.tools.list_ports.comports():
    print item

有人能帮我理解为什么第一次导入不能运行comports()这个方法吗?

我明白导入更少的内容到内存中是个好习惯,但我也在使用PySerial模块的其他方法。感觉同时导入serial和serial.tools.list_ports有点多余。

1 个回答

2

导入 serial 模块时,会创建这个模块里所有的名字。听起来很简单,但你要知道 serial 里面并没有叫“tools”的属性。其实“tools”是一个单独的模块。

import 这个命令会帮你导入父模块,这就是为什么当你导入 serial.tools.list_ports 时,也会顺便导入 serial.tools。它确实也会导入 serial,但最好还是自己明确地导入它,而不是让 Python 不小心帮你导入。

>>> import this
The Zen of Python, by Tim Peters

 ...
Explicit is better than implicit.
 ...

撰写回答