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执行外部程序的常用方法小结
Mar 21 Python
Python的socket模块源码中的一些实现要点分析
Jun 06 Python
简单谈谈Python流程控制语句
Dec 04 Python
Python爬取当当、京东、亚马逊图书信息代码实例
Dec 09 Python
Python线程创建和终止实例代码
Jan 20 Python
python基于C/S模式实现聊天室功能
Jan 09 Python
python requests指定出口ip的例子
Jul 25 Python
python处理自动化任务之同时批量修改word里面的内容的方法
Aug 23 Python
Python获取统计自己的qq群成员信息的方法
Nov 15 Python
Pytorch 使用tensor特定条件判断索引
Apr 08 Python
详解运行Python的神器Jupyter Notebook
Jun 03 Python
Python可视化神器pyecharts之绘制地理图表练习
Jul 07 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静态新闻列表自动生成代码
2007/06/14 PHP
测试php函数的方法
2013/11/13 PHP
php实现singleton()单例模式实例
2014/11/06 PHP
PHP从零开始打造自己的MVC框架之路由类实现方法分析
2019/06/03 PHP
window.parent调用父框架时 ie跟火狐不兼容问题
2009/07/30 Javascript
JQUERY 浏览器判断实现函数
2009/08/20 Javascript
js实现单一html页面两套css切换代码
2013/04/11 Javascript
不要使用jQuery触发原生事件的方法
2014/03/03 Javascript
基于Flowplayer打造一款免费的WEB视频播放器附源码
2015/09/06 Javascript
JS+CSS实现的竖向简洁折叠菜单效果代码
2015/10/22 Javascript
JS从数组中随机取出几个数组元素的方法
2016/08/02 Javascript
将鼠标焦点定位到文本框最后(代码分享)
2017/01/11 Javascript
使用JS中的Replace()方法遇到的问题小结
2017/10/20 Javascript
JS计算两个时间相差分钟数的方法示例
2018/01/10 Javascript
vue form 表单提交后刷新页面的方法
2018/09/04 Javascript
angularJs select绑定的model取不到值的解决方法
2018/10/08 Javascript
详解vue数组遍历方法forEach和map的原理解析和实际应用
2018/11/15 Javascript
package.json配置文件构成详解
2019/08/27 Javascript
vue实现图片懒加载的方法分析
2020/02/05 Javascript
在vue中封装的弹窗组件使用队列模式实现方法
2020/07/23 Javascript
vue中的v-model原理,与组件自定义v-model详解
2020/08/04 Javascript
js 函数性能比较方法
2020/08/24 Javascript
python将MongoDB里的ObjectId转换为时间戳的方法
2015/03/13 Python
Scrapy-redis爬虫分布式爬取的分析和实现
2017/02/07 Python
python 定时修改数据库的示例代码
2018/04/08 Python
Python学习笔记之函数的定义和作用域实例详解
2019/08/13 Python
python实现五子棋游戏(pygame版)
2020/01/19 Python
python进行二次方程式计算的实例讲解
2020/12/06 Python
纯css实现照片墙3D效果的示例代码
2017/11/13 HTML / CSS
Beauty Expert美国/加拿大:购买奢侈美容产品
2018/12/05 全球购物
如何处理简单的PHP错误
2015/10/14 面试题
大学生入党思想汇报
2014/01/14 职场文书
讲解员培训方案
2014/05/04 职场文书
Nginx服务器添加Systemd自定义服务过程解析
2021/03/31 Servers
springmvc直接不经过controller访问WEB-INF中的页面问题
2022/02/24 Java/Android
我家女友可不止可爱呢 公开OP主题曲无字幕动画MV
2022/04/11 日漫