이것은 당신이 만들 수있는 가장 기본적인 문맥 관리자입니다 :
class UselessContextManager(object):
def __enter__(self):
pass
def __exit__(self, type, value, traceback):
pass
with UselessContextManager() as nothing:
print(nothing is None)
당신이 실제로 프로세스 흐름이 어떻게 생겼는지에 대한 약간의 느낌을 얻고 싶다면, 노력이 하나
class PrintingContextManager(object):
def __init__(self, *args, **kwargs):
print('Initializing with args: {} and kwargs: {}'.format(args, kwargs))
def __enter__(self):
print('I am entering the context')
print('I am returning 42')
return 42
def __exit__(self, type, value, traceback):
print('And now I am exiting')
print('Creating manager')
manager = PrintingContextManager()
print('Entering with block')
with manager as fnord:
print('Fnord is {}'.format(fnord))
print('End of context')
print('Out of context')
출력 :
Creating manager
Initializing with args:() and kwargs: {}
Entering with block
I am entering the context
I am returning 42
Fnord is 42
End of context
And now I am exiting
Out of context
코드를 다음과 같이 수정해야합니다. type, value, traceback
을 인쇄 한 다음 with
블록에서 예외를 발생시킵니다.
>>> f = open('/tmp/spanish_inquisition.txt', 'w')
>>> f.__enter__
<function TextIOWrapper.__enter__>
>>> f.__exit__
<function TextIOWrapper.__exit__>
: 당신은 파일을 항상 상황에 맞는 관리자 것을 볼 수 있습니다
thing = ContextManager()
try:
stuff = thing.__enter__()
except Exception as e:
stuff.__exit__(type(e), e.args[0], e.__traceback__)
Though truthfully it's a bit different
:
당신이 볼 수 있듯이, with
구문에 대한 거의 단지 짧은
파일이 ContextManager 일 수 있다는 것을 몰랐습니다. 수퍼 클래스를 상속하거나 명시 적으로 인터페이스를 구현하지 않고 두 가지 메소드를 구현하면됩니다. 다시 말하지만, 저는이 언어를 처음 접했습니다.
파이썬에서는 이 인터페이스를 명시 적으로 구현하는입니다. Java에서는 준수 할 인터페이스를 지정해야합니다. 파이썬에서는 단지 그렇게합니다. 파일과 같은 객체가 필요합니까? .read()
메서드를 추가하십시오. 어쩌면 .seek()
, .open()
및 .close()
일 것입니다. 하지만 파이썬에서 ...
it = DecoyDuck()
if it.walks_like_a_duck() and it.talks_like_a_duck() and it.quacks_like_a_duck():
print('It must be a duck')
파일 관리자는 * 컨텍스트 관리자입니다. – user2357112
열린 후'with'는 쓰기 후에 파일을 안전하게 닫습니다. – n1c9
https://www.python.org/dev/peps/pep-0343/을 읽으셨습니까? –