小甲鱼第51讲:《__name__="__main__"、搜索路径和包》课后练习题
测试题:
0. __name__属性指的是在调用该模块的时候调用的函数名称,方便在模块的被调用的时候,模块内部被调用的函数不会被运行。
1. 当模块作为主程序运行的时候,__name__属性的值是“__main__”,当该模块被调用导入到另一个模块的时候,"__name__"属性值为模块名称。
2. 通过sys模块的path变量显示搜索路径:
1 import sys 2 sys.path
3. 将相关模块文件的路径加入到搜索路径中,例如:
1 import sys 2 sys.path.append("*****") # *****表示模块坐在路径
但是这里小甲鱼推荐把包最好都存放在python的安装路径里面的sitepackages文件夹内,顺便说一下,安装包的时候,比如numpy直接在官网下载wheel源代码文件然后存入sitepackages文件夹内就可以直接调用numpy这个包里面的所有模块和函数了,再次感谢开源的好处。
4. urllib属于包,request属于包里面的模块
5. 包其实就是在普通文件夹内添加了文件“__init__.py”的模块文件,文件夹内拥有模块,此时文件夹就是一个包了,所以文件夹是否是包的最大区别就是是否拥有“__init__.py”模块。其中这个__init__.py文件就是一个初始化文件,可以为空,也可以写入一些初始化的代码。
动动手:
0. 修改以下程序:
1 # a.py 2 import b 3 4 def x(): 5 print('x') 6 7 b.y() 8 9 # b.py 10 import a 11 12 def y(): 13 print('y') 14 15 a.x() 16 17 执行 b.py 引发下边异常: 18 >>> 19 Traceback (most recent call last): 20 File "/Users/FishC/Desktop/b.py", line 1, in <module> 21 import a 22 File "/Users/FishC/Desktop/a.py", line 1, in <module> 23 import b 24 File "/Users/FishC/Desktop/b.py", line 6, in <module> 25 a.x() 26 AttributeError: 'module' object has no attribute 'x'
最好的方式,是单独建立一个模块,用来调用a和b模块,因为a与b两个模块不会被互相调用,否则因为任何一个模块的不完整而报错:
1 # test.py 2 3 import a 4 import b 5 a.x() 6 b.y()
还有一个方式,如果不想建立一个单独的模块,可以这样(程序就不会报错了):
1 # a.py 2 # import b 3 4 5 def x(): 6 print('x')
1 # b.py 2 import a 3 4 5 def y(): 6 print('y') 7 8 if __name__ == "__main__": 9 a.x()
The more efforts,the more happiness