python项目开发中首先要学习的几个知识点
1.知识点:
-
python中的推荐命名规范。
-
python项目的推荐目录结构。
-
python中
__init__.py
的作用。 -
python中在不同文件夹/同一个文件夹两种情况下如何引用另一个.py文件。
-
python为什么要使用
if __name__ == '__main__':
。
2.解释:
-
python中的推荐命名规范。
参考Google开源风格
python代码中需要命名的主要包括包、模块、类、函数、变量、常量,python之父
Guido
推荐的 命名方法如下:*类型 说明 示例 包 小写下划线 my_package 模块 小写下划线 my_module 类 大驼峰命名法
MyClass
函数 小写下划线 my_function 变量 小写下划线 my_variable 常量 大写下划线
MY_CONSTANT
-
python项目的推荐目录结构。
以项目名称为‘MyProject为例,说明推荐的目录结构,如下:’
MyProject/ 项目名称 |-- bin/ 目录下放项目的可执行文件 | |-- myproject | |-- my_project/ 所有的项目代码、模块目录都放在这个目录下 | |-- tests/ 单元测试代码目录 | | |-- __init__.py | | |-- test_main.py | | | |-- __init__.py | |-- main.py 程序入口 | |-- docs/ 项目文档目录 | |-- conf.py | |-- abc.txt | |-- setup.py 安装、部署、打包的脚本 |-- requirements.txt 依赖的外部python包的列表 |-- README 项目说明文件
-
python中
__init__.py
的作用。__init__.py
主要有两个作用:- 让代码文件夹变成可以被导入
import
的软件包,如果文件夹下没有__init__.py
文件则使用import 或from import
会报错ImportError: No module named...
- 使用
from pakge import *
时 *****所指的模块可以在__init__.py
中自定义
下面以2中推荐目录说明
__init__.py
的作用,python3.3及以上版本不使用__init__.py
也不会报错,但在这里我们还是推荐使用__init__.py
-
以2中目录为例,如果
my_project
文件夹和tests
文件夹中没有__init__.py
,那么在想要在docs
文件夹下的conf.py
文件中使用其他模块将会报错,如下:conf.py
中代码运行结果 import my_project.main
ImportError: No module named my_project.main
import my_project.tests.test_main
ImportError: No module named my_project.tests.test_main
-
以2中目录为例,如果只有
my_project
中有__init__.py
,那么在想要在docs
文件夹下的conf.py
文件中使用其他模块如下:conf.py
中代码运行结果 import my_project.main
成功 import my_project.tests.test_main
ImportError: No module named my_project.tests.test_main
-
以2中目录为例,如果
my_project
文件夹和tests
文件夹中都有__init__.py
,那么在想要在docs
文件夹下的conf.py
文件中使用其他模块如下:conf.py
中代码运行结果 import my_project.main
成功 import my_project.tests.test_main
成功
- 让代码文件夹变成可以被导入
-
python中在不同文件夹/同一个文件夹两种情况下如何引用另一个.py文件。
-
不同文件夹
在python3.3及以上的版本中,不同文件夹引用.py文件的方法如下:
# 以2中目录为例,my_project目录中的main.py 要引用 tests 目录下的test_main.py import tests.test_main # 或者 from tests import test_main
在python3.3以下的版本,在要引用.py的文件夹下添加
__init__.py
文件后,可使用如上同样的方法导入.py模块。 -
同一文件夹直接使用
import 模块名
(.py文件名)导入
-
-
python为什么要使用
if __name__ == '__main__':
。先给结论:
1.防止当前.py文件在被其他.py文件导入时显示多余的程序主体部分
2.程序的入口
举例如下:
有
aa_one.py
文件,其中定义了一个print_a()
方法,同时还打印了一行字符串
现在有aa_two.py
想要调用aa_one.py
中的方法print_a()
方法,如下:
我们从如上执行结果可以看到,我们只想要调用执行aa_one.py
中的方法print_a()
方法,但在调用print_a()
方法之前就先执行print('what ever')
,原因是在我们使用import aa_one
语句导入时会把aa_one.py中的代码执行一遍,如何规避这个问题呢,有的同学可能会想到把print('what ever')
删除掉不就好了吗,这其实是一种解决方案,但是更多时候我们在写一些功能类或者方法的时候,我们就是需要在文件中编写一些测试的代码,但是在写完之后我们又不想删除,因为可能有时候还需要调整测试,为了满足这个需求,我们就可以使用if __name__ == '__main__':
,我们再来看下使用了if __name__ == '__main__':
的情况:
这个时候print('what ever')
就不会在调用中被执行,功能类和方法的调试代码就可以写到if __name__ == '__main__':
中,在被其他模块调用时也不用删除这些测试代码,同时if __name__ == '__main__':
也作为**程序的入口
**。