Python 奇技淫巧

摘要: Python 奇技淫巧 显示有限的接口到外部 当发布python第三方package时,并不希望代码中所有的函数或者class可以被外部import,在__init__.py中添加__all__属性,该list中填写可以import的类或者函数名, 可以起到限制的import的作用, 防止外部import其他函数或者类。

Python 奇技淫巧

显示有限的接口到外部

当发布python第三方package时,并不希望代码中所有的函数或者class可以被外部import,在__init__.py中添加__all__属性,该list中填写可以import的类或者函数名, 可以起到限制的import的作用, 防止外部import其他函数或者类。

  1. <a href="http://click.aliyun.com/m/24149/">#!/usr/bin/env python</a>
  2. <a href="http://click.aliyun.com/m/24149/"># -*- coding: utf-8 -*-</a>
  3. <a href="http://click.aliyun.com/m/24149/">from base import APIBase</a>
  4. <a href="http://click.aliyun.com/m/24149/">from client import Client</a>
  5. <a href="http://click.aliyun.com/m/24149/">from decorator import interface, export, stream</a>
  6. <a href="http://click.aliyun.com/m/24149/">from server import Server</a>
  7. <a href="http://click.aliyun.com/m/24149/">from storage import Storage</a>
  8. <a href="http://click.aliyun.com/m/24149/">from util import (LogFormatter, disable_logging_to_stderr,</a>
  9. <a href="http://click.aliyun.com/m/24149/">enable_logging_to_kids, info)</a>
  10. <a href="http://click.aliyun.com/m/24149/">__all__ = ['APIBase', 'Client', 'LogFormatter', 'Server',</a>
  11. <a href="http://click.aliyun.com/m/24149/">'Storage', 'disable_logging_to_stderr', 'enable_logging_to_kids',</a>
  12. <a href="http://click.aliyun.com/m/24149/">'export', 'info', 'interface', 'stream']</a>

with的魔力

with语句需要支持上下文管理协议的对象, 上下文管理协议包含__enter____exit__两个方法。 with语句建立运行时上下文需要通过这两个方法执行进入和退出操作。

其中上下文表达式是跟在with之后的表达式, 该表达式返回一个上下文管理对象。

  1. <a href="http://click.aliyun.com/m/24149/"># 常见with使用场景</a>
  2. <a href="http://click.aliyun.com/m/24149/">with open("test.txt", "r") as my_file: # 注意, 是__enter__()方法的返回值赋值给了my_file,</a>
  3. <a href="http://click.aliyun.com/m/24149/">for line in my_file:</a>
  4. <a href="http://click.aliyun.com/m/24149/">print line</a>

详细原理可以查看这篇文章, 浅谈 Python 的 with 语句。

知道具体原理,我们可以自定义支持上下文管理协议的类,类中实现__enter____exit__方法。

  1. <a href="http://click.aliyun.com/m/24149/">#!/usr/bin/env python</a>
  2. <a href="http://click.aliyun.com/m/24149/"># -*- coding: utf-8 -*-</a>
  3. <a href="http://click.aliyun.com/m/24149/">class MyWith(object):</a>
  4. <a href="http://click.aliyun.com/m/24149/">def __init__(self):</a>
  5. <a href="http://click.aliyun.com/m/24149/">print "__init__ method"</a>
  6. <a href="http://click.aliyun.com/m/24149/">def __enter__(self):</a>
  7. <a href="http://click.aliyun.com/m/24149/">print "__enter__ method"</a>
  8. <a href="http://click.aliyun.com/m/24149/">return self # 返回对象给as后的变量</a>
  9. <a href="http://click.aliyun.com/m/24149/">def __exit__(self, exc_type, exc_value, exc_traceback):</a>
  10. <a href="http://click.aliyun.com/m/24149/">print "__exit__ method"</a>
  11. <a href="http://click.aliyun.com/m/24149/">if exc_traceback is None:</a>
  12. <a href="http://click.aliyun.com/m/24149/">print "Exited without Exception"</a>
  13. <a href="http://click.aliyun.com/m/24149/">return True</a>
  14. <a href="http://click.aliyun.com/m/24149/">else:</a>
  15. <a href="http://click.aliyun.com/m/24149/">print "Exited with Exception"</a>
  16. <a href="http://click.aliyun.com/m/24149/">return False</a>
  17. <a href="http://click.aliyun.com/m/24149/">def test_with():</a>
  18. <a href="http://click.aliyun.com/m/24149/">with MyWith() as my_with:</a>
  19. <a href="http://click.aliyun.com/m/24149/">print "running my_with"</a>
  20. <a href="http://click.aliyun.com/m/24149/">print "------分割线-----"</a>
  21. <a href="http://click.aliyun.com/m/24149/">with MyWith() as my_with:</a>
  22. <a href="http://click.aliyun.com/m/24149/">print "running before Exception"</a>
  23. <a href="http://click.aliyun.com/m/24149/">raise Exception</a>
  24. <a href="http://click.aliyun.com/m/24149/">print "running after Exception"</a>
  25. <a href="http://click.aliyun.com/m/24149/">if __name__ == '__main__':</a>
  26. <a href="http://click.aliyun.com/m/24149/">test_with()</a>

执行结果如下:

Python 奇技淫巧​​​​​​​

原文链接

相关推荐