转载:http://python-china.org/t/725

参考:http://www.cnblogs.com/alamZ/p/6943869.html

用 __all__ 暴露接口,这是一种约定

Python 可以在模块级别暴露接口:

__all__ = ["foo", "bar"]

1、提供了哪些是公开接口的约定

  不像 Ruby 或者 Java,Python 没有语言原生的可见性控制,而是靠一套需要大家自觉遵守的”约定“下工作。比如下划线开头的应该对外部不可见。同样,__all__ 也是对于模块公开接口的一种约定,比起下划线,__all__ 提供了暴露接口用的”白名单“。一些不以下划线开头的变量(比如从其他地方 import 到当前模块的成员)可以同样被排除出去。

import os
import sys__all__ = ["process_xxx"]  # 排除了 `os` 和 `sys`def process_xxx():pass  # omit

2、控制 from xxx import * 的行为

  代码中当然是不提倡用 from xxx import * 的写法的,但是在 console 调试的时候图个方便还是很常见的。如果一个模块 spam 没有定义 __all__,执行 from spam import * 的时候会将 spam非下划线开头的成员都导入当前命名空间中,这样当然就有可能弄脏当前命名空间。如果显式声明了 __all__import * 就只会导入 __all__ 列出的成员。如果 __all__ 定义有误,列出的成员不存在,还会明确地抛出异常,而不是默默忽略。

3、为 lint 工具提供辅助

  编写一个库的时候,经常会在 __init__.py 中暴露整个包的 API,而这些 API 的实现可能是在包中其他模块中定义的。如果我们仅仅这样写:

from foo.bar import Spam, Egg

  一些代码检查工具,如 pyflakes 就会报错,认为 SpamEggimport 了又没被使用的变量。当然一个可行的方法是把这个警告压掉:

  from foo.bar import Spam, Egg  # noqa

  但是更好的方法是显式定义 __all__,这样代码检查工具会理解这层意思,就不再报 unused variables 的警告:

from foo.bar import Spam, Egg__all__ = ["Spam", "Egg"]

  需要注意的是大部分情况下 __all__ 都是一个 list,而不是 tuple 或者其他序列类型。如果写了其他类型的 __all__,如无意外 pyflakes 等 lint 工具会无法识别出。

4、定义 all 需要注意的地方

  • 如上所述,__all__ 应该是 list 类型的
  • 不应该动态生成 __all__,比如使用列表解析式。__all__ 的作用就是定义公开接口,如果不以字面量的形式显式写出来,就失去意义了。
  • 即使有了 __all__ 也不应该在非临时代码中使用 from xxx import * 语法,或者用元编程手段模拟 Ruby 的自动 import。Python 不像 Ruby,没有 Module 这种成员,模块就是命名空间隔离的执行者。如果打破了这一层,而且引入诸多动态因素,生产环境跑的代码就充满了不确定性,调试也会非常困难。
  • 按照 PEP8 建议的风格,__all__ 应该写在所有 import 语句下面,和函数、常量等模块成员定义的上面。

  如果一个模块需要暴露的接口改动频繁,__all__ 可以这样定义: 

__all__ = ["foo","bar","egg",
]

  最后多出来的逗号在 Python 中是允许的,也是符合 PEP8 风格的。这样修改一个接口的暴露就只修改一行,方便版本控制的时候看 diff

转载于:https://www.cnblogs.com/shengulong/p/7425088.html

python里的“__all__ ”作用相关推荐

  1. python里compile的作用_Python代码中compile()函数具有哪些功能呢?

    摘要: 下文讲述Python代码中compile()函数的功能说明,如下所示: compile()函数功能说明 compile()函数功能: 用于将一个字符串编译为字节代码 compile()函数语法 ...

  2. python里dir是什么意思_python中dir什么作用

    python中dir的作用是:1.dir函数传入数据类型返回该数据类型的所有内置方法:2.dir函数传入模块名返回该模块的所有属性和方法. dir() 内置函数的作用 python 内置方法有很多,无 ...

  3. python怎么使用-Python中__all__作用何在以及如何使用?

    1 为什么会有`__all__`? Java.C++等面向对象语言,会使用如public.private.protect等之类的关键字限定一个程序文件中类.变量.方法的被外部程序调用的作用域. Pyt ...

  4. 【无标题】Python __all__=[]作用

    python模块中的__all__属性,可用于 模块导入时限制,如: from module import * 此时被导入模块若定义了__all__属性,则只有__all__内指定的属性.方法.类可被 ...

  5. python装饰器类-PYTHON里的装饰器能装饰类吗

    扩展回答 如何理解python里的装饰器 通常可以理解它是一个hook 的回调函数. 或者是理解成python 留给二次开发的一个内置API. 一般是用回调和hook 方式实现的. 如何理解Pytho ...

  6. python except用法和作用_121个问题答对80%那么恭喜你,Python的高薪工作迟早有你一份...

    1. Python和Java.PHP.C.C#.C++等其他语言的对比? 2. 简述解释型和编译型编程语言? 3. 代码中要修改不可变数据会出现什么问题? 抛出什么异 4. print 调用 Pyth ...

  7. python里面的dict和set

    python里面的dict和set dict Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速 ...

  8. 九大神招,让Python里数据分析神器Jupyter,完美升华

    九大神招,让Python里数据分析神器Jupyter,完美升华 Notebook作为一款经典的交互式编辑器,在视图数据等实时展示方面有其特有的优势,但是相比pycharm.sublime等编辑工具,J ...

  9. python super()方法的作用_详解python的super()的作用和原理

    Python中对象方法的定义很怪异,第一个参数一般都命名为self(相当于其它语言的this),用于传递对象本身,而在调用的时候则不必显式传递,系统会自动传递.uz0免费资源网 今天我们介绍的主角是s ...

最新文章

  1. C++——创建类的时候用new与不用new 的区别(转)
  2. 产品设计丨价格理论与用户体验
  3. 嵌入式软件常见笔试面试题总结 .
  4. 【Trie】阅读理解(luogu 3879/ybtoj Trie-4)
  5. 使用react实现select_React笔记——核心概念:9.表单
  6. C#中设置webBrowser为可编辑模式
  7. python中pd是什么意思_python怎么用pd导入xlsx
  8. java 父子级json组装不用递归_初级Java程序员如何进阶
  9. 力扣-746. 使用最小花费爬楼梯
  10. 软考计算机网络与最大流量,软考程序员考点计算机网络之性能
  11. Web页面iOS真机调试-win10
  12. 扫地机器人欠压检测电路_36v欠压保护电路图大全(六款模拟电路设计原理图详解)...
  13. brew mysql_brew mysql
  14. zabbix监控windows主机网卡流量
  15. lammps学习(一)单晶硅纳米磨削
  16. 植物大战僵尸anroid版
  17. 办公软件——隐私条款
  18. OpenCV C++案例实战六《绿幕视频背景替换》
  19. Android6.0 ios,意超越iOS9!谷歌寄希望于Android6.0系统
  20. jni-Demo-基于linux(c++ java)

热门文章

  1. python安装了怎么使用_Python PyCharm 安装与简单使用
  2. python反转列表不用切片,在Python中反转切片
  3. Sudo 授权需谨慎,否则脸上泪两行
  4. 云原生存储详解:容器存储与 K8s 存储卷
  5. latex字体_[LaTeX 引擎] XeLaTeX + macOS,通过字体名调用发行版字体
  6. oracle中各种函数,oracle中常用函数大全
  7. nbu无法运行java控制台_Netbackup:nbu常见错误及故障解决
  8. 计算开始到结束的时间_阿里钉钉首次战胜微信,云计算的涨停潮只是开始,远未结束...
  9. python程序运行不出来_python实战演练2:python可执行文件运行不成功怎么办
  10. oracle服务器错误,oracle 11g数据库维护中错误总结