Python keyword with & as
as
as,事实上,从英文意思我们也可以很好的理解,“用作,作为”,就是把什么当作什么来用,其实简单的来说就是一个rename,重命名操作,例如:
import tensorflow as tf
我们引入了一个tensorflow的包,并将它重命名为tf,这样我们在后续调用相关的函数的时候将会非常方便,并且代码会显得比较简洁。
而更多的时候,在代码中间,as通常都是和with一起使用的
with
可能我们经常会遇到一种情况:我们需要某个变量,或者说我们打算进行一系列的操作,但是需要一定的变量条件,必须进行一定的预先处理,并且在完成这一系列操作之后,我们还需要对这个变量进行一定的后续处理(最典型的例如:文件的打开和关闭),这时with可以帮助我们很好的解决这个问题。
当我们需要把某个计算图作为默认计算图进行一系列操作(比如定义若干张量)的时候:
import tensorflow as tf
graph = tf.Graph()
with graph.as_default():
# do sth
或者更常见的,一个文件打开操作:
with open('some_file.txt', encoding='utf-8', error='ignore') as input:
for line in input.readlines():
# do sth
这个时候,with已经帮我们完成了后续的处理工作了,你不需要去担心打开的文件是否关闭,而这些只需要一个简单的with和as,就可以写出非常优雅的代码。
如果你只是想简单知道with是如何使用的,那么你到这里就可以结束了,但如果你对with究竟是如何工作的感到好奇的话,可以继续往下阅读。相信对你了解如何准确的使用with有很大的帮助
more further
你可能会感兴趣with究竟是怎么工作的,事实上,with对于作用的对象有一定的要求:
- 需要一个**__enter__()**方法
- 还需要一个**__exit__()**方法
我们可以定义这样一个类:
class someObject:
def __enter__(self):
print('here we enter')
return 'someObject'
def __exit__(self, type, value, trace):
print('here we exit')
然后配合with实例化一个对象:
with someObject() as so:
print(so,'do something')
输出结果如下:
我们看到,__enter__最先被调用了,然后是我们在with中定义的打印语句,最后调用了__exit__。你会发现变量so就是__enter__函数的返回值。你可能会发现这两个方法都有参数,联系一下__exit__方法,你如果熟悉的话,很快会想到的就是:错误处理。
没错,事实上with一个更加强大的功能就是错误处理。我们可以尝试运行一下下面的代码:
class someError:
def __enter__(self):
# 返回实例对象本身
return self
def __exit__(self, type, value, trace):
print('type: ', type)
print('value: ', value)
print('trace: ', trace)
def error_(self):
# array out of bound
array_ = [1.0, 2.0]
print(array_[2])
然后使用with和as,在作用范围中调用函数error_:
with someError() as se:
se.error_()
输出结果如下:
可以看到,输出的type是错误类型,value是错误内容,而trace则是打印出了一个对象的地址,很容易想到这个对象就是我们实例化的对象se。
我们在调用**error_**方法前加入下面一行代码:
print(se)
打印结果为:
(打印结果地址稍微有点不同,两者相差了0x2820,这应该是与Python对象在内存中的存储方式有关,有兴趣可以查找一下,相关资料,猜测有可能是对象函数在内存中的存储位置。。。)
所以就是,当错误发生的时候,会把相关的信息,也就是错误类型等传递给__exit__函数,最终打印出来错误信息。更多with的用法可以去阅读一些Python相关的使用文档,进一步了解一下有关的参数