불변을 추적하기 위해 액세스를 제어하려는 리소스가 있습니다. 특정 전역 변수가 변경 될 때마다 파일에 쓰고 싶습니다. 아이디어는 파일의 데이터가 항상 변수의 데이터와 일치해야한다는 것입니다. with
변수를 변경하는 코드를 래핑하고 저장 작업이 발생하는지 확인 하는 문을 사용하여이를 구현하기로 결정했습니다 .
문제 : 실행 중에 A가 B를 호출하는 것을 제외하고는이 변수를 변경할 수있는 두 개의 함수 A와 B가 있다고 가정합니다. 따라서 with
B 내부의 with
문이 이미 A의 문 안에 중첩되어있을 때 실행되지 않도록 만들려고 합니다. 이것은의 동작과 유사 RLock
에서 threading
, 이에 with some_rlock():
는 유사한 문장 안에 이미있는 경우 차단하지 않습니다.
class Resource(object):
r_file = open("r_file.txt", 'a+')
def __init__(self):
self.a = 0
self.r_file.write("Initial value : %s\n"%str(self.a))
def add(self):
self.a += 1
def __enter__(self):
print "entering"
def __exit__(self, type, value, traceback):
self.r_file.write("New value : %s\n"%str(self.a))
resource = Resource()
def B():
with resource: # should not perform __exit__ operation if already inside A's with statement
resource.add()
def A():
with resource:
B()
resource.add()
A()
기본적으로 "새 값 : ..."이 한 번 표시되기를 원합니다 r_file.txt
(이 작업에 작업 B가 포함되어 있더라도 한 작업 A 동안에 만 액세스되었으므로). 그렇게하는 방법이 있습니까?
class Resource(object):
def __init__(self):
self._with_count = 0
def __enter__(self):
print("Doing enter stuff")
self._with_count += 1
return self
def __exit__(self, type, value, traceback):
self._with_count -= 1
assert self._with_count >= 0
if self._with_count == 0:
print("Doing exit stuff")
resource = Resource()
with resource:
with resource:
pass
산출:
Doing enter stuff
Doing enter stuff
Doing exit stuff
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다