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已经帮我们完成了后续的处理工作了,你不需要去担心打开的文件是否关闭,而这些只需要一个简单的withas,就可以写出非常优雅的代码。
如果你只是想简单知道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])

然后使用withas,在作用范围中调用函数error_

with someError() as se:
	se.error_()

输出结果如下:
在这里插入图片描述
可以看到,输出的type是错误类型,value是错误内容,而trace则是打印出了一个对象的地址,很容易想到这个对象就是我们实例化的对象se
我们在调用**error_**方法前加入下面一行代码:

print(se)

打印结果为:
在这里插入图片描述
(打印结果地址稍微有点不同,两者相差了0x2820,这应该是与Python对象在内存中的存储方式有关,有兴趣可以查找一下,相关资料,猜测有可能是对象函数在内存中的存储位置。。。)

所以就是,当错误发生的时候,会把相关的信息,也就是错误类型等传递给__exit__函数,最终打印出来错误信息。更多with的用法可以去阅读一些Python相关的使用文档,进一步了解一下有关的参数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值