2019独角兽企业重金招聘Python工程师标准>>>

写好一个pyton模块

###项目结构

model.py 项目关键的类

util.py 项目帮助文件

api.py 开放的api

main.py 项目的启动脚本


###0 __init__.py文件 python 的模块是通过__init__.py文件组织,当用户import module时,该文件自动执行。

"""
XXX library
~~~~~~~~~~~~~~~~~~~~~
how to use
usage:>>> print "ok" ok
"""__title__ = ''
__version__ = '1.0.0'
__author__ = 'jchluo'
#__license__ = 'Apache 2.0'
#__copyright__ = ''#import api
from .model import ToyModel # Set default logging handler to avoid "No handler found" warnings.
import logging
try:  # Python 2.7+from logging import NullHandler
except ImportError:class NullHandler(logging.Handler):def emit(self, record):passlogging.getLogger(__name__).addHandler(NullHandler())

分为四部分,分别是注释、元数据、公开API、其他操作。

A 注释

提供模块名、描述等信息和简单的使用样例,以方便用户使用。

使用样例应该遵循doctest包的格式,以进行自动化测试。格式是

  • ">>> "表示输入,注意:>>>后面的一个空格必须
  • 下一行表示期待的输出
  • 注意:样例必须写在源文件、方法或者类的开头
  • 测试的命令python -m doctest -v your_module.py

例如著名的网络模块requests使用样例如下

"""
usage:>>> import requests>>> r = requests.get('https://www.python.org')>>> r.status_code200>>> 'Python is a programming language' in r.contentTrue
"""
B 元数据

提供包的标题、版本号、作者等信息,如果是开源模块,最好提供licence和copyright.

C 公开API

在这里import你希望用户使用的类和方法,用户代码通过包的名字直接访问。

例如著名的网络模块requests公开的部分API如下

from .models import Request, Response, PreparedRequest
from .api import request, get, head, post, patch, put, delete, options
from .sessions import session, Session

当用户需要使用get方法时,可以通过

>>>import requests
>>>r = request.get("http://www.baidu.com")

代码中requestsget方法就是通过from .api import get导进来的。 如果不在这里import,即必须

>>>import requests.api
>>>r = request.api.get("http://www.baidu.com")

不在这里import有很多缺点。

1、用户使用不方便,容易出错,通过import具体的api包来调用方法。

2、泄露了requests的具体实现。假设将来有更好的访问网络方式,api过时,但是requests不能删除api模块,因为用户的代码中都写了api包,一旦删除了,用户代码全部出错。

3、用户可能会调用api的私有方法,导致程序出错。因为私有方法是内部使用的。

D 其他操作

这里提供一些loggingwarnings的配置。

我们进行一些重要的操作时,一般通过打log的方式以进行记录,以方便后续的分析等。

request包的底层urllib3的connectionpool.py是这样打log:

>>> import logging
>>> log = logging.getLogger(__name__)
>>> log.warn("Get xxx ")
No handlers could be found for logger "__main__"

尝试一下就会发现,这时会提示第4行的"No handlers"的提示。

这是因为如果没有配置好log的handler信息,log不知道怎么处理这个warn信息。

**一般来说,我们希望log的配置由用户的代码来控制。由用户来决定打log的格式,输出的位置,是到文件还是屏幕。**所以模块包一般不对log进行配置。

模块包需要对log进行操作,例如log.warn("xxx"),但是又不能配置log的输出位置,于是就有上面No handler的提示。

为了没有上面的提示,模块包只好给log配置了一个空handler,这个hander什么都不做,只是占位,因为有了hander, 所以提示就不再出现了。同时,如果用户配置了log,就会把这个空handler覆盖,采用了用户的配置。下面代码 是模块包配置的空handler

import logging
try:  # Python 2.7+from logging import NullHandler
except ImportError:class NullHandler(logging.Handler):def emit(self, record):passlogging.getLogger(__name__).addHandler(NullHandler())

假设用户自己处理log, 可以输入以下代码

>>> import logging
>>> logging.basicConfig(level=logging.DEBUG,format='%(asctime)s %(levelname)s %(message)s',filename='myapp.log')
>>> import requests
>>> requests.get("http://www.baidu.com")

注意:上面是用户的代码,不是模块包的代码

这时候,urlllib3的 log就打到了文件myapp.log

2015-12-19 22:07:36,032 DEBUG "GET / HTTP/1.1" 200 None

###1 类


###2 方法


转载于:https://my.oschina.net/jinchang/blog/547921

如何写一个pyton模块相关推荐

  1. 如何在React Native中写一个自定义模块

    前言 在 React Native 项目中可以看到 node_modules 文件夹,这是存放 node 模块的地方,Node.js 的包管理器 npm 是全球最大的开源库生态系统.提到npm,一般指 ...

  2. 如何在 React Native 中写一个自定义模块

    前言 在 React Native 项目中可以看到 node_modules 文件夹,这是存放 node 模块的地方,Node.js 的包管理器 npm 是全球最大的开源库生态系统.提到npm,一般指 ...

  3. 用python3+ PyQt5写一个NFC模块的串口小工具的一星期

    用python3+ PyQt5写一个NFC模块的串口小工具的一星期 原因始于我们的小团队,没有写Windows上位机的人才.自己的[NFC读读写模](https://shop165836966.tao ...

  4. 手把手教你自己写一个Python模块,并将其发布并安装到自己的Python环境中去

    首先得说明一点,python的模块就是有一些.py文件所构成的,所以要想写一个模块,自己得先写一些python程序,我这里就写一个module1.py 1.接下来,就是先建立一个文件夹my_packa ...

  5. python根目录_每日一练(22)-自己写一个python模块并发布到本机环境

    1.新建目录saycolor-demo mkdir saycolor-demo 2.新建setup.py,内容如下 from packages指定需要导入的python包 3.新建saycolor包, ...

  6. python写音乐播放器_AJ Kipper:用Python写一个简易的MP3播放器

    用Python写一个简易的MP3播放器 前言 最近在学习Web.py框架的时候,了解了基本的Python连接数据库(MySQL)的方法.学完后,总想用它来干点啥,于是,就想能不能写一个MP3播放器.一 ...

  7. 怎么样写一个 node.js模块以及NPM Package

    你来到了写一个mode.js模块的舞台中央,不管你是因为自己需要写一个你自己的nodejs模块,还是你仅仅是处于好奇.无论是什么原因,在这个教程里,我将给你演示怎样创建一个nodejs模块. node ...

  8. Vue.js如何写一个简单的原生js模块,浏览器中的表现如何?

    2019独角兽企业重金招聘Python工程师标准>>> 浏览器正在逐步的支持原生JavaScript模块.Safari和Chrome的最新版本已经支持它们了,Firefox和Edge ...

  9. 使用PySimpleGUI模块,写一个正则表达式的编辑器

    总流程 分析需求 代码实现 代码说明 1. self.rule 2. self.columns和self.rule_button 3. self.window_location 下步改进 1. sel ...

最新文章

  1. SQL Server 中print Datetime类型问题
  2. jquery mobile 页面间的传递参数
  3. android 中使用TabHost控件实现微信界面的底部菜单效果
  4. linux下通过yum安装svn及配置
  5. pgjdbc源码分析
  6. file_get_contents(php://input)
  7. VC6-VC2008转移到VC2015问题记录
  8. DSP课设项目(ICETEK-VC5509-EDU)
  9. iPad怎么截屏?iPad快速截图的7种方式
  10. 手机上编写Java程序的软件
  11. 3dMax模型的重置变换
  12. NWR,Gossip,Paxos分布式一致性协议
  13. 仿山楂岛留言源码/公众号吸粉/短视频引流神器
  14. 出售永磁同步电机(pmsm)模型预测控制(MPC)matlab/simulink仿真模型,转速控制,电流控制,转矩控制,直接预测控制(有限集模型预测控制)(这单矢量和双矢量,三矢量),无差拍,foc矢
  15. PostgreSQL 视图
  16. 九爷带你了解 zabbix 飞信以及机器人报警
  17. 查看TRP开头的数据量超过1000000的表的index情况
  18. 国家企业信用信息公示系统爬虫——流程分析
  19. RTMPLive多流媒体协议转无插件直播协议(RTMP)解决方案
  20. SQL Server菜鸟入门

热门文章

  1. 批量取出PHP BOM头
  2. redis专题:redis集群的动态扩容缩容,水平扩展
  3. 泛型之类型擦除和桥接方法
  4. Linux中7个判断文件系统类型的方法
  5. Linux 64位进程地址空间分布概况
  6. Zookeeper可视化工具PrettyZoo
  7. @Resource注解使用详解
  8. python开发-常见面试题
  9. 微信中的这个功能尽早设置,即使转错账也能及时收回!
  10. linux目录结构及作用详图