Python项目中如何优雅的import

前言

之前有一篇关于Python编码规范的随笔, 但是写的比较杂乱, 因为提到了import语句, 在篇文章中, 我专门来讲Python项目中如何更好的import

标准库与第三方库的导入

导入一个模块, 如果模块名太长, 则使用import as; 如果是导入子模块, 则使用from import as

如果需要导入类的, 则使用from import导入类, 如果要导入某一个模块的多各类的话, 则类名使用逗号分隔

示例

导入sklearn中的svm中的SVC类

import sklearn.svm

from sklearn.svm import SVC

导入numpy中的random模块

import numpy.random as nprand

总结: 如果导入类的话, 一定是import somemod 和 from somemod import class两个语句组成的; 如果导入一个不同的模块的则, 则一般就是import somemod

项目模块导入

项目目录

wxoa ›› tree -Cl

.

├── main.py

├── test

└── wxoa

├── __init__.py

├── __pycache__

│ └── __init__.cpython-35.pyc

├── entity

│ ├── __init__.py

│ ├── __pycache__

│ │ ├── __init__.cpython-35.pyc

│ │ └── user.cpython-35.pyc

│ └── user.py

└── util

├── __init__.py

├── __pycache__

│ ├── __init__.cpython-35.pyc

│ └── ioutil.cpython-35.pyc

└── ioutil.py

7 directories, 12 files

主程序为main.py, 项目名为wxoa, 存放源代码的目录也叫wxoa, 也是一个python package

导入规则(在第一次写这篇文章的时候我喜欢相对导入(以为google的sklearn是采用这种方式的, 但是在test中使用的是绝对导入(sklearn在test.py函数中直接使用绝对路径, 因为已经写好的sklearn已经安装到了python路径中了(sklearn的test是在这种情况下进行测试的), 而一般我们的项目是没有安装到python路径中)), 但是官方建议绝对导入, 如果要使用绝对导入有不报错的话, 我的方法是这只软链接)

存在python package(所以这里不包含main.py)中的python文件包导入的规则

使用from . import somemod导入当前目录下的模块

使用from ..somemod import submod导入上一级目录的somemod目录下的submod模块

如果名称太长则使用as缩减

不在python package(就是这里的main.py和test目录下的文件)中的python文件的导入规则

使用from somemod.submod.subsubmod import some导入, 注意这里不使用.号起头, 关于使用., ..的作用在下面会说明, 如果使用了.起头则会报错, 提示父模块没有加载

其中somemod就是我们的源码的python package包名, 在这里就是wxoa

如果名称太长则使用as缩减

关于.和..

在包导入中, 如果出现了.和..起头, 则会涉及到package(不是module)的关系, ..表示上一级package, 这个上一级package需要有一个__init__.py才是合法的, .表示当前package, 当前package需要有一个__init__.py才是合法的

.和..涉及到的python程序的启动项, 这里会比较复杂, 简而言之, 在涉及到..表示的上级package的时候, 如果python程序的启动文件就是在这里则Python解释器不会认为..表示的上级目录的package是一个合法的目录, 尽管有__init__.py文件, 因此会报错; 这样就给代码测试带来的麻烦, 不能直接在使用..和.中直接测试代码, 也就是

if __name__ == '__main__':

pass

因为这样已启动程序就会报错, 所以报错, 在下面提出解决方案

关于.和..带来的麻烦的解决方案

和上面展示的项目目录一样, 主启动程序, 项目源代码(主要是模块), 测试代码分离, main.py在项目目录下, test(普通的文件夹, 存放python测试文件, 运行的时候cd ..目录, 也就是在醒目目录下, 使用python -m test.test1 执行程序)也在项目目录下, 项目源代码就是wxoa

在main.py和test目录下的python文件中导入自己项目中的模块, 就不要使用.和..起头了, 否则会报错, 而是使用绝对路径, 如这里的, from wxoa.service import user

关于import

import在默认的情况下是查看__name__属性判断是否加载的, 如果这个模块是__main__则它就是top level(顶级)的, 没有上一级目录, 所以from .. import ....是会把报错的, 在python3中的添加了__package__来解决这个问题, 在执行有from ..import ...的文件的时候, 使用python -m pkg.modname 执行modname.py文件, 将__package__从None改为pkg.modname才能正确的运行程序, 当__package__生效的时候, __name__在导入模块的时候会被忽略

不建议使用全路径导入, 这样情况必须安装第三方库才能使用, 否则一定会出现import错误, 提示路径找不到

关于Python编程

虽然Python是面向对象编程, 但是通过开源项目you-get发现, 可以将Python理解为面向模块开发, 模块在Python也是对象, 面向模块开发会让一切都轻松起来, 模块中定义的全局变量为其属性, 模块中的函数为其方法, 如果多个函数有联系, 再考虑将其封装到一个类中, 在调用该模块的时候, 一般通过一个模块函数返回对象, 不用让用户过多的考虑__init__()方法的参数, 直接在模块函数中配置好信息返回即可

加入我们开发一个util工具箱, 则建立一个util包(和Java的包一样), 在里面创建strings.py, log.py等模块(类似于Java中的一些.java文件), 在log.py模块文件中定义一些需要的函数, 函数之间有某种联系或者为了方便起见可以定义类封装

关于模块设计

示例:

创建一个工具包, 该包中有关于字符串和IO操作的内容

首先考虑都放在一个模块文件中, 文件他们都是工具, 放在util.py中是可以的

接着考虑到我们不需要创建strings和io的类, 因为工具我们只需要一个就可以, 这与模块是一样的特性, 所以将所有的操作写成函数, 如果这样的话, 模块中没有类对函数进行分类, 函数都在util.py中会很混乱, 所以将util.py升级为util包, 创建strings.py和io.py, 将对应的函数放入对应的模块文件中

示例1:

坦克游戏

考虑放到game.py模块下

tank, bullet, wall等都是游戏中的对象, 并且他们与工具类不同, 他们不只是一个对象, 而是可以创建很多, 与模块特性不同, 所有把他们都写成类, 在game文件中通过类划分是可行的方案

python导入标准库对象的语句_Python项目中如何优雅的import相关推荐

  1. Python导入标准库和扩展库对象的几种方式

    Python中的对象大概可以分为三类:内置对象.标准库对象和扩展库对象.其中内置对象是直接编译进解释器的可以直接使用,没有对应的Python源代码:标准库对象是随Python安装的,但是需要导入才能使 ...

  2. python常用标准库的基本用法_Python常用标准库之fileinput

    Python常用标准库之fileinput fileinput模块用于对标准输入或多个文件进行逐行遍历.这个模块的使用非常简单,相比open()方法批量处理文件,fileinput模块可以对文件.行号 ...

  3. python导入标准库的关键字是,导入整个Python标准库

    我需要一种方法将整个Python标准库导入我的程序. 虽然这看起来似乎是一个坏主意,但我想这样做是因为py2exe会将整个标准库与我的程序打包在一起,所以我的用户可以在我给它们的shell中从中导入它 ...

  4. Python使用标准库zipfile提取docx文档中所有图片

    清华科技大讲堂免费直播课预告: 免费直播课|Python数据可视化与科学计算可视化案例分享,5月28日晚20:00-21:30 ============ 哔哩哔哩网站免费视频观看地址: 董老师在哔哩哔 ...

  5. Python使用标准库zipfile+re提取docx文档中超链接文本和链接地址

    推荐教材: <Python程序设计实用教程>,ISBN:978-7-5635-6065-3,董付国,北京邮电大学出版社 教材封面: 全国各地新华书店有售 京东购买链接: 配套资源:教学大纲 ...

  6. python标准库导入对象语句_下面哪些是正确的Python标准库对象导入语句?-智慧树Java程序设计(山东联盟-鲁东大学)章节答...

    Java程序设计(山东联盟-鲁东大学):下面哪些是正确的Python标准库对象导入语句?[单选题] A:保证两个或多个进程同时启动和结束 B:保证两个或多个线程同时启动和结束 C:保证任何时候只有一个 ...

  7. python缺少标准库_干货分享:Python如何自动导入缺失的库

    很多同学在写Python项目时会遇到导入模块失败的情况:ImportError: No module named 'xxx'或者ModuleNotFoundError: No module named ...

  8. python标准库有多强大_Python标准库——走马观花

    原文:Python标准库--走马观花 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python的一大好处在于它有一套很有用的标 ...

  9. 常用Python标准库对象速查表(1)

    封面图片:<Python程序设计基础(第2版)>,董付国,清华大学出版社 =============== 常用Python标准库对象速查表(1) 标准库 对象 简要说明 math sin( ...

最新文章

  1. 删除数据 DataIntegrityViolationException: not-null property references a null or transient value解决...
  2. mySQL:两表更新(用一个表更新另一个表)的SQL语句
  3. [scala-spark]9. RDD创建操作
  4. 谈谈如何学习Linux操作系统?
  5. 你这么努力为什么还是做不好?
  6. BGP小实验(二)——还是他,继续第二波走起来
  7. HtmlAgilityPack的简单使用
  8. 毕业论文排版之Word 中公式居中,编号靠右该怎么设置(针对左右不对称页边距)
  9. 全国首个人工智能专业,怎么学?
  10. VS|Qt工作笔记-修改pro文件生成目录清晰的项目结构并添加三方库
  11. java se开发_JAVA_SE基础——3.Java程序的开发流程
  12. 为Angular(2+)开发人员提供带TypeScript的Vue.js
  13. system.out输出到文件上
  14. 【新书推荐】【2020】卫星通信(第三版)
  15. 德国人的智慧--生活是具体的
  16. Bootstrap的160个小图标和使用
  17. IEEE Transactions on Systems, Man, and Cybernetics: Systems(TSMC)投稿须知
  18. php twitter api,使用PHP通过twitter api获取twitter的推文信息
  19. 【SQL文档整理系列1】MySQL创建procedure(可以用来造测试数据)
  20. 网络监测是如何工作的?

热门文章

  1. Maven 发布到本地仓库
  2. NameNode与DataNode的工作原理剖析
  3. 「实战篇」开源项目docker化运维部署-后端java部署(七)
  4. Linux - 搭建FastDFS分布式文件系统
  5. JDK 11 马上就要来了!JDK 12 还会远吗?
  6. Firefox浏览器中,input输入框输入的内容在刷新网页后为何还在?
  7. Linux防火墙设置-DNS服务器篇
  8. Fedora19 搭建LAMP环境
  9. Spring BeanFactory实例化Bean的过程
  10. 图像缩放算法_技术专栏|基于无人机LK光流算法的适用性及其优化方法探究