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. 飘逸的python - 性能调优利器profile及其意义

    VIM 的作者Bram Moolenaar在一篇叫高效文本编辑器的7个习惯的ppt中有这么一段话. Three basic steps 1.    Detect inefficiency 2.    ...

  2. 飘逸的python - __new__、__init__、__call__傻傻分不清

    __new__: 对象的创建,是一个静态方法.第一个參数是cls.(想想也是,不可能是self,对象还没创建,哪来的self) __init__ : 对象的初始化, 是一个实例方法,第一个參数是sel ...

  3. Python进阶 - 命名空间与作用域

    Python进阶 - 命名空间与作用域 写在前面 如非特别说明,下文均基于Python3 命名空间与作用于跟名字的绑定相关性很大,可以结合另一篇介绍Python名字.对象及其绑定的文章. 1. 命名空 ...

  4. 【Python】 命名空间与LEGB规则

    命名空间与LEGB规则 之前隐隐约约提到过一些关于Python赋值语句的特殊性的问题,这个问题的根源就在于Python中的变量的命名空间机制和之前熟悉的C也好java也好都不太一样. ■ 命名空间 所 ...

  5. python的命名空间

    Python的命名空间是Python程序猿必须了解的内容,对Python命名空间的学习,将使我们在本质上掌握一些Python中的琐碎的规则. 接下来我将分四部分揭示Python命名空间的本质:一.命名 ...

  6. Python中命名空间与作用域使用总结

    1 引言 命名空间与作用域是程序设计中的基础概念,深入理解有助于理解变量的生命周期,减少代码中的莫名其妙bug.Python的命名空间与作用域与Java.C++等语言有很大差异,若不注意,就可能出现莫 ...

  7. 飘逸的python - @staticmethod和@classmethod的作用与区别

    一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法. 而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用. 这有利于组织代码,把某些应 ...

  8. Python Namespace - 命名空间

    命名空间 命名空间 namespace 对 python 来说是一个非常核心的概念,整个 python 虚拟机运行的机制与 namespace 概念有这非常紧密的联系. 从'赋值'说起, python ...

  9. Python之命名空间、闭包、装饰器

    一.命名空间 1. 命名空间 命名空间是一个字典,key是变量名(包括函数.模块.变量等),value是变量的值. 2. 命名空间的种类和查找顺序 - 局部命名空间:当前函数 - 全局命名空间:当前模 ...

随机推荐

  1. 【数据库摘要】12_Sql_存储过程

    SQL 存储过程 存储过程创建语法: create or replace procedure 存储过程名(param1 in type,param2 out type) as 变量1 类型(值范围); ...

  2. JS - 点击 “+” 、“-” 改变数字

    效果: 代码: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Test.a ...

  3. css js 优化工具

    我知道国内很多网页制作人员都还在制作table式网页,这样的网页打开速度很慢.如果要想网站打开速度快,就要学会使用DIV+CSS,将图片写进CSS,这样如果网站内容很多的时候,也不会影响网页的浏览.它 ...

  4. android studio 9.png 报错

    Eclipse里能正常运行,但是导入到Android Studio里就报如下的错误 百度了下,说有两种解决办法一种是改后缀名,还有一种是重新在Android Studio里画一下点9图片.但是这个项目 ...

  5. linux nc命令使用详解

    功能说明:功能强大的网络工具 语 法:nc [-hlnruz][-g<网关...>][-G<指向器数目>][-i<延迟秒数>][-o<输出文件>][-p ...

  6. C++内存管理学习笔记(6)

    /****************************************************************/ /*            学习是合作和分享式的! /* Auth ...

  7. How to get the source code of the chromium of the specified revision

    I'd like to get the source code of the chromium 34.0.1847.9. gclient config http://src.chromium.org/ ...

  8. Android开发之style属性和提前定义样式

    摘要 Android平台定义的主题样式: android:theme="@android:style/Theme.Dialog" // 将一个Activity显示为对话框模式and ...

  9. hdu2112 HDU Today

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2112 题目分类:SPFA算法+map容器 错误点:红色标记部分 代码: #include<bit ...

  10. 解决CentOS无法显示中文字体 | 系统运维 | Web2.0

    解决CentOS无法显示中文字体 | 系统运维 | Web2.0 About Me    博客园    devops    前端    张家港水蜜桃 傍晚好! 2013年09月12日 17:56:08 ...