目的: 了解Python with語法
Python with的語法有點像是c++的scope,當進入with區間時, 會進入__enter__function, 當離開with區間時, 會先執行__exit__ function (即使with區間產生exception也會進__exit__)
範例1. __enter__ return自己
#!/usr/bin/python
class A:
def __init__(self):
print "__init__"
def __enter__(self):
print "__enter__"
return self
def __exit__(self, exc_ty, exc_val, tb):
print "__exit__"
a = A()
with a:
print " in with "
結果:
__init__ __enter__ in with x=<__main__ data-blogger-escaped-.a="" data-blogger-escaped-0x7faa8553ac68="" data-blogger-escaped-at="" data-blogger-escaped-instance=""> __exit__
範例2. __enter__ 不return值
#!/usr/bin/python
class A:
def __init__(self):
print "__init__"
def __enter__(self):
print "__enter__"
def __exit__(self, exc_ty, exc_val, tb):
print "__exit__"
a = A()
with a as x:
print " in with x=%r" % x
結果:
__init__ __enter__ in with x=None __exit__
範例3. __enter__ return另一個class的obj
#!/usr/bin/python
#!/usr/bin/python
class B:
def __init__(self):
pass
def showB(self):
print "This is B"
class A:
def __init__(self):
print "__init__"
def __enter__(self):
print "__enter__"
return B()
def __exit__(self, exc_ty, exc_val, tb):
print "__exit__"
a = A()
with a as b:
print " in with "
b.showB()
結果:
__init__ __enter__ in with This is B __exit__
範例4. with區間有raise Exception
#!/usr/bin/python
class A:
def __init__(self):
print "__init__"
def __enter__(self):
print "__enter__"
return self
def __exit__(self, exc_ty, exc_val, tb):
print "__exit__ %r %r %r" % (exc_ty, exc_val, tb)
a = A()
with a as x:
print " in with x=%r" % x
raise Exception("exp1234")
結果: (可以看到__exit__仍有被執行且__exit__的參數有exception相關資訊)
__init__ __enter__ in with x=<__main__ data-blogger-escaped-.a="" data-blogger-escaped-0x7f1c4bc0ac68="" data-blogger-escaped-at="" data-blogger-escaped-instance=""> __exit__Exception('exp1234',) Traceback (most recent call last): File "./with.py", line 16, in raise Exception("exp1234") Exception: exp1234
沒有留言:
張貼留言