Python中规范定义命名空间的一些建议


Posted in Python onJune 04, 2016

API的设计是一个艺术活。往往需要其简单、易懂、整洁、不累赘。
很多时候,我们在底层封装一个方法给高层用,而其它的方法只是为了辅助这个方法的。
也就是说我们只需要暴露这个方法就行,不用关心这个方法是怎么实现的,不用关心其它辅助方法的存在。
在Python中,有几种策略来保持命名空间的整洁。

1.变量命名用下划线_开头
下划线_开头的变量在其它模块from xxx import *的时候不被import。
如果你看decimal的源码,就会发现多次把import 的模块弄成下划线_开头的别名。
http://hg.python.org/cpython/file/2.7/Lib/decimal.py
比如

import copy as _copy
import math as _math
import numbers as _numbers

这不是蛋疼,是为了不污染命名空间

2.定义__all__
python的魔术方法实在是灵活。
假设我模块中有3个方法a(),b(),c()
我只是要暴露a而已,不需要暴露b和c。
这时__all__=[a]
在其它模块from xxxmodule import *的时候就只import了a了。
而且在开发者阅读源码的时候,看到了__all__,一下子就知道要暴露的是哪些方法,而不是一堆代码无从下手。

3.在使用了这个变量后删掉
通过del xxx删掉。
这样在dir(xxxmodule)的时候就减少了dir出来满屏的变量了。
同样在decimal的源码,可以看到使用了正则表达式模块re之后,用del re删掉了。
还有一种方法就是把import语句放在函数内,将其限制在局部作用域中。感觉这种方法不pythonic,就不推荐了。

Python 相关文章推荐
一个小示例告诉你Python语言的优雅之处
Jul 04 Python
python使用xpath中遇到:到底是什么?
Jan 04 Python
使用anaconda的pip安装第三方python包的操作步骤
Jun 11 Python
python的中异常处理机制
Aug 30 Python
Python中单线程、多线程和多进程的效率对比实验实例
May 14 Python
Python制作词云图代码实例
Sep 09 Python
Python获取、格式化当前时间日期的方法
Feb 10 Python
python利用datetime模块计算程序运行时间问题
Feb 20 Python
利用python绘制数据曲线图的实现
Apr 09 Python
Python3-异步进程回调函数(callback())介绍
May 02 Python
python实现图书馆抢座(自动预约)功能的示例代码
Sep 29 Python
安装pyinstaller遇到的各种问题(小结)
Nov 20 Python
全面理解Python中self的用法
Jun 04 #Python
举例讲解Python中字典的合并值相加与异或对比
Jun 04 #Python
详解Python中open()函数指定文件打开方式的用法
Jun 04 #Python
Python中import导入上一级目录模块及循环import问题的解决
Jun 04 #Python
Python输出汉字字库及将文字转换为图片的方法
Jun 04 #Python
使用Python的Flask框架来搭建第一个Web应用程序
Jun 04 #Python
Python的Django中将文件上传至七牛云存储的代码分享
Jun 03 #Python
You might like
隐性调用php程序的方法
2009/03/09 PHP
php启用sphinx全文搜索的实现方法
2014/12/24 PHP
PHP面向对象程序设计模拟一般面向对象语言中的方法重载(overload)示例
2019/06/13 PHP
javascript的trim,ltrim,rtrim自定义函数
2008/09/21 Javascript
JS类的封装及实现代码
2009/12/02 Javascript
javascript中文本框中输入法切换的问题
2013/12/10 Javascript
红米手机抢购的js代码
2014/03/10 Javascript
常用的Javascript数据验证插件
2015/08/04 Javascript
JS使用cookie实现DIV提示框只显示一次的方法
2015/11/05 Javascript
jQuery Dialog对话框事件用法实例分析
2016/05/10 Javascript
artDialog+plupload实现多文件上传
2016/07/19 Javascript
概述一个页面从输入URL到页面加载完的过程
2016/12/16 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(二)
2017/01/21 Javascript
JS验证字符串功能
2017/02/22 Javascript
JS实现数组简单去重及数组根据对象中的元素去重操作示例
2018/01/05 Javascript
解决vue中使用Axios调用接口时出现的ie数据处理问题
2018/08/13 Javascript
Vue2.x中利用@font-size引入字体图标报错的解决方法
2018/09/28 Javascript
[37:03]完美世界DOTA2联赛PWL S3 INK ICE vs GXR 第二场 12.16
2020/12/18 DOTA
python批量下载图片的三种方法
2013/04/22 Python
Python格式化css文件的方法
2015/03/10 Python
python通过伪装头部数据抵抗反爬虫的实例
2018/05/07 Python
利用Django模版生成树状结构实例代码
2019/05/19 Python
Pycharm如何打断点的方法步骤
2019/06/13 Python
Python高级编程之消息队列(Queue)与进程池(Pool)实例详解
2019/11/01 Python
python实现布隆过滤器及原理解析
2019/12/08 Python
PyCharm下载和安装详细步骤
2019/12/17 Python
django 文件上传功能的相关实例代码(简单易懂)
2020/01/22 Python
Python生成随机验证码代码实例解析
2020/06/09 Python
python装饰器三种装饰模式的简单分析
2020/09/04 Python
详解Python+Selenium+ChromeDriver的配置和问题解决
2021/01/19 Python
什么是ESB?请介绍一下ESB?
2015/05/27 面试题
银行存款证明样本
2014/01/17 职场文书
酒店采购员岗位职责
2015/04/03 职场文书
后天观后感
2015/06/08 职场文书
生日宴会家属答谢词
2015/09/29 职场文书
python ansible自动化运维工具执行流程
2021/06/24 Python