飘逸的python - 保持命名空间的整洁
2013-08-31 21:32
197 查看
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中,有几种策略来保持命名空间的整洁。
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 - 保持命名空间的整洁
- Python3.2官方文档翻译--作用域和命名空间实例
- Python3.2官方文档翻译--作用域和命名空间实例
- python作用域与命名空间
- Python的一个命名空间冲突,关于from-import机制
- python基础6之命名空间与作用域
- Python命名空间和作用域窥探
- Python两个内置函数——locals 、globals 和命名空间说明
- Python命名空间和作用域
- 【ZZ】python命名空间与作用域
- 【python】lxml处理命名空间
- Python 命名空间和内置函数 locals和globals
- Python 变量作用域 —— 命名空间与 LEGB 规则
- python面向对象之类的命名空间与组合
- Python之命名空间、闭包、装饰器
- Python 命名空间 及变量搜索规则 属性名称 属性名称 无点号运算的变量名
- python __name__属性带来命名空间问题
- Python中将字典转换为XML以及相关的命名空间解析
- python :__future__模块简介、命名空间简介、with语句
- python 函数 本地变量 函数的命名空间 变量的作用域