您将什么称为存储为变量的代码行?

时间:2015-12-27 12:41:28

标签: python

如果我将一行代码存储为变量,则将其称为字符串

例如

with open(filename) as Class:

会成为字符串还是别的什么?

1 个答案:

答案 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__,它们是上下文管理器元素