如果我将一行代码存储为变量,则将其称为字符串
例如
with open(filename) as Class:
会成为字符串还是别的什么?
答案 0 :(得分:3)
with X as Y
构造用于上下文管理器,Y
只是一个变量名,由X 构造的上下文管理器组成。这里没有涉及任何字符串。这不是“存储为变量的代码行”,这是由存储在Y中的X创建的对象,创建一个上下文,在此代码块的最后,将调用__exit__
方法来释放资源(例如尽可能接近文件。)
有关详细说明,请参阅原始PEP document
特别是它不适用于字符串
with "test" as var:
print var
导致错误
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: __exit__
因为字符串它不是上下文管理器。
另一方面, open
返回file
类型的实例,它是一个上下文管理器
print open('somefile.txt')
给你
<open file 'somefile.txt', mode 'r' at 0x7fdec7469db0>
如果你的方法
print dir(open('somefile.txt'))
你得到了
['__class__', '__delattr__', '__doc__', '__enter__', '__exit__', '__format__', '__getattribute__', '__hash__', '__init__', '__iter__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'close', 'closed', 'encoding', 'errors', 'fileno', 'flush', 'isatty', 'mode', 'name', 'newlines', 'next', 'read', 'readinto', 'readline', 'readlines', 'seek', 'softspace', 'tell', 'truncate', 'write', 'writelines', 'xreadlines']
其中特别包括__enter__
和__exit__
,它们是上下文管理器元素