라이브러리에서 사용하는 일부 변수에 "감시자"를 추가하고 싶습니다. 유형은 collections.deque
, dict
, weakref.WeakSet
, 및 list
입니다.컬렉션 개체를 래핑하여 상태 변경을 로그하는 일반 개체 "감시자"프록시 (추가/삭제)
언제든지 항목이 추가/추가되거나 터지지 않을 때 로그 메시지 을 생성하고 싶습니다.
내가 원래 코드의 변경을 최소화하고자:
나는 변수에 액세스하고 수정하는 모든 장소에서 로그 메시지를 추가하지 않습니다.
내가 원래 클래스에서 상속 내 자신의 클래스를 만들려하지 않는 대신 (예 :
class InstrumentedDeque(collections.deque): ...
)
, 이것이 문제이다, 그것은 가능 하나 제네릭을 만드는 것입니다 위의 모든 컬렉션 오브젝트에 대해 작동하는 클래스 (또는 래퍼/데코레이터)가 필요하므로 변경이 필요한 유일한 곳은 오브젝트가 처음 작성된 곳입니다. self.scheduled
및 self.ready
... 다음
def __init__(self):
self.scheduled = []
self.ready = collections.deque()
같은 일 것입니다 필요한 변경 사항 만 ...
def __init__(self):
self.scheduled = MyLogger([], var_name='scheduled')
self.ready = MyLogger(collections.deque(), var_name='ready')
장비없이 :이 "볼"2 개 바르 원래 코드 인 경우 계측 후
test = Test()
test.add(1)
test.add(2)
test.pop()
는
변경test = Test()
test.add(1)
***instrumentation output. scheduled: [1]
***instrumentation output. ready: deque([1])
test.add(2)
***instrumentation output. scheduled: [1, 2]
***instrumentation output. ready = deque([1, 2])
test.pop()
***instrumentation output. scheduled: [2]
***instrumentation output. ready: deque([2])
예 add()
및 pop()
는 다음과 같이 보일 것이다 0 ...
def add(self, val):
heapq.heappush(self.scheduled, val)
self.ready.append(val)
def pop(self):
heapq.heappop(self.scheduled)
self.ready.popleft()
나는 "래퍼"클래스를 만드는 시도하고 __new__
, __init__
, __getattr__
연주하지만하지 않은 것 이 기능을 사용하려면 이 필요합니다. 이게 뭔가 ...
class MyLooger:
def __new__(cls):
# what to do?
def __init__(self):
# what to do?
def __getattr__(self, name):
# what to do?
어떤 도움을 주시면 감사하겠습니다.
, 당신은 '잊은는 –
어디 .add'? 나는 그 대답을 몇 번 편집했다. –
@jd. 일반적으로 작동하도록 코드를 업데이트했습니다. –