导入 Python 模块的具体性?
我一直在使用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.
...