语句集变量为None

时间:2014-10-29 17:57:29

标签: python syntax

我正在尝试运行此代码:

class A:
    def __enter__(self):
        print "enter"
    def __exit__(self, *args):
        print "exit"
    def __init__(self, i):
        self.i = i
with A(10) as a:
    print a.i

我收到了这个错误:

enter
exit
Traceback (most recent call last):
File ".last_tmp.py", line 9, in <module>
print a.i
AttributeError: 'NoneType' object has no attribute 'i'

我的语法有什么问题?

2 个答案:

答案 0 :(得分:10)

您需要从self返回__enter__

def __enter__(self):
    print "enter"
    return self

您的with声明实际上等同于:

a = A(10).__enter__()  # with A(10) as a:
try:
    print a.i  # Your with body
except:
    a.__exit__(exception and type)
    raise
else:
    a.__exit__(None, None, None)

因此,您需要返回一些内容,否则a的值为None(默认返回值),None没有名为i的属性,所以你得到一个AttributeError

答案 1 :(得分:2)

对象的__enter__方法的返回值是as关键字后面的名称。您的方法(隐式)返回None,导致您看到的错误。相反,__enter__应返回self,以便将A(10)创建的对象分配给a