美文网首页
Python 奇技淫巧

Python 奇技淫巧

作者: 乱蓬头199302 | 来源:发表于2017-06-27 17:54 被阅读0次

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

显示有限的接口到外部

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

#!/usr/bin/envpython

#-*-coding:utf-8-*-

frombaseimportAPIBase

fromclientimportClient

fromdecoratorimportinterface,export,stream

fromserverimportServer

fromstorageimportStorage

fromutilimport(LogFormatter,disable_logging_to_stderr,

enable_logging_to_kids,info)

__all__=['APIBase','Client','LogFormatter','Server',

'Storage','disable_logging_to_stderr','enable_logging_to_kids',

'export','info','interface','stream']

with的魔力

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

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

#常见with使用场景

withopen("test.txt","r")asmy_file:#注意,是__enter__()方法的返回值赋值给了my_file,

forlineinmy_file:

printline

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

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

#!/usr/bin/envpython

#-*-coding:utf-8-*-

classMyWith(object):

def__init__(self):

print"__init__ method"

def__enter__(self):

print"__enter__ method"

returnself#返回对象给as后的变量

def__exit__(self,exc_type,exc_value,exc_traceback):

print"__exit__ method"

ifexc_tracebackisNone:

print"Exited without Exception"

returnTrue

else:

print"Exited with Exception"

returnFalse

deftest_with():

withMyWith()asmy_with:

print"running my_with"

print"------分割线-----"

withMyWith()asmy_with:

print"running before Exception"

raiseException

print"running after Exception"

if__name__=='__main__':

test_with()

执行结果如下:

__init__ method

__enter__ method

running my_with

__exit__ method

ExitedwithoutException

------分割线-----

__init__ method

__enter__ method

running beforeException

__exit__ method

ExitedwithException

Traceback(most recent calllast):

File"bin/python",line34,in

exec(compile(__file__f.read(),__file__,"exec"))

File"test_with.py",line33,in

test_with()

File"test_with.py",line28,intest_with

raiseException

Exception

证明了会先执行__enter__方法, 然后调用with内的逻辑, 最后执行__exit__做退出处理, 并且, 即使出现异常也能正常退出

原文链接

相关文章

网友评论

      本文标题:Python 奇技淫巧

      本文链接:https://www.haomeiwen.com/subject/xuiecxtx.html