如何写一个pyton模块
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")
代码中requests
的 get
方法就是通过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 其他操作
这里提供一些logging
和 warnings
的配置。
我们进行一些重要的操作时,一般通过打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模块相关推荐
- 如何在React Native中写一个自定义模块
前言 在 React Native 项目中可以看到 node_modules 文件夹,这是存放 node 模块的地方,Node.js 的包管理器 npm 是全球最大的开源库生态系统.提到npm,一般指 ...
- 如何在 React Native 中写一个自定义模块
前言 在 React Native 项目中可以看到 node_modules 文件夹,这是存放 node 模块的地方,Node.js 的包管理器 npm 是全球最大的开源库生态系统.提到npm,一般指 ...
- 用python3+ PyQt5写一个NFC模块的串口小工具的一星期
用python3+ PyQt5写一个NFC模块的串口小工具的一星期 原因始于我们的小团队,没有写Windows上位机的人才.自己的[NFC读读写模](https://shop165836966.tao ...
- 手把手教你自己写一个Python模块,并将其发布并安装到自己的Python环境中去
首先得说明一点,python的模块就是有一些.py文件所构成的,所以要想写一个模块,自己得先写一些python程序,我这里就写一个module1.py 1.接下来,就是先建立一个文件夹my_packa ...
- python根目录_每日一练(22)-自己写一个python模块并发布到本机环境
1.新建目录saycolor-demo mkdir saycolor-demo 2.新建setup.py,内容如下 from packages指定需要导入的python包 3.新建saycolor包, ...
- python写音乐播放器_AJ Kipper:用Python写一个简易的MP3播放器
用Python写一个简易的MP3播放器 前言 最近在学习Web.py框架的时候,了解了基本的Python连接数据库(MySQL)的方法.学完后,总想用它来干点啥,于是,就想能不能写一个MP3播放器.一 ...
- 怎么样写一个 node.js模块以及NPM Package
你来到了写一个mode.js模块的舞台中央,不管你是因为自己需要写一个你自己的nodejs模块,还是你仅仅是处于好奇.无论是什么原因,在这个教程里,我将给你演示怎样创建一个nodejs模块. node ...
- Vue.js如何写一个简单的原生js模块,浏览器中的表现如何?
2019独角兽企业重金招聘Python工程师标准>>> 浏览器正在逐步的支持原生JavaScript模块.Safari和Chrome的最新版本已经支持它们了,Firefox和Edge ...
- 使用PySimpleGUI模块,写一个正则表达式的编辑器
总流程 分析需求 代码实现 代码说明 1. self.rule 2. self.columns和self.rule_button 3. self.window_location 下步改进 1. sel ...
最新文章
- SQL Server 中print Datetime类型问题
- jquery mobile 页面间的传递参数
- android 中使用TabHost控件实现微信界面的底部菜单效果
- linux下通过yum安装svn及配置
- pgjdbc源码分析
- file_get_contents(php://input)
- VC6-VC2008转移到VC2015问题记录
- DSP课设项目(ICETEK-VC5509-EDU)
- iPad怎么截屏?iPad快速截图的7种方式
- 手机上编写Java程序的软件
- 3dMax模型的重置变换
- NWR,Gossip,Paxos分布式一致性协议
- 仿山楂岛留言源码/公众号吸粉/短视频引流神器
- 出售永磁同步电机(pmsm)模型预测控制(MPC)matlab/simulink仿真模型,转速控制,电流控制,转矩控制,直接预测控制(有限集模型预测控制)(这单矢量和双矢量,三矢量),无差拍,foc矢
- PostgreSQL 视图
- 九爷带你了解 zabbix 飞信以及机器人报警
- 查看TRP开头的数据量超过1000000的表的index情况
- 国家企业信用信息公示系统爬虫——流程分析
- RTMPLive多流媒体协议转无插件直播协议(RTMP)解决方案
- SQL Server菜鸟入门