From ebd941c5d4e0ec8d20b00b98aac7edfcc00f517f Mon Sep 17 00:00:00 2001 From: Soju06 Date: Thu, 7 Nov 2024 14:55:28 +0900 Subject: [PATCH 1/3] =?UTF-8?q?=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=ED=95=84?= =?UTF-8?q?=ED=84=B0=20=EA=B0=9D=EC=B2=B4=20repr=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pykis/event/filters/product.py | 13 ++++++++++--- pykis/event/filters/subscription.py | 10 +++++++--- pykis/event/handler.py | 23 +++++++++++++++++++++-- 3 files changed, 38 insertions(+), 8 deletions(-) diff --git a/pykis/event/filters/product.py b/pykis/event/filters/product.py index 30cb19f1..f3d4fbb6 100644 --- a/pykis/event/filters/product.py +++ b/pykis/event/filters/product.py @@ -44,9 +44,7 @@ def __init__(self, symbol: str, market: MARKET_TYPE): self.market = market -class KisProductEventFilter( - KisEventFilterBase["KisWebsocketClient", KisSubscriptionEventArgs[TWebsocketResponse]] -): +class KisProductEventFilter(KisEventFilterBase["KisWebsocketClient", KisSubscriptionEventArgs[TWebsocketResponse]]): _product: KisSimpleProductProtocol @@ -93,3 +91,12 @@ def __filter__( and e.response.symbol == self._product.symbol and e.response.market == self._product.market ) + + def __hash__(self) -> int: + return hash((self.__class__, self._product)) + + def __repr__(self) -> str: + return f"{self.__class__.__name__}(symbol={self._product.symbol!r}, market={self._product.market!r})" + + def __str__(self) -> str: + return repr(self) diff --git a/pykis/event/filters/subscription.py b/pykis/event/filters/subscription.py index 412c194e..05634d2f 100644 --- a/pykis/event/filters/subscription.py +++ b/pykis/event/filters/subscription.py @@ -13,9 +13,7 @@ ] -class KisSubscriptionEventFilter( - KisEventFilterBase["KisWebsocketClient", KisSubscriptionEventArgs[TWebsocketResponse]] -): +class KisSubscriptionEventFilter(KisEventFilterBase["KisWebsocketClient", KisSubscriptionEventArgs[TWebsocketResponse]]): """TR 구독 이벤트 필터""" __slots__ = ("id", "key") @@ -34,3 +32,9 @@ def __filter__( def __hash__(self) -> int: return hash((self.__class__, self.id, self.key)) + + def __repr__(self) -> str: + return f"{self.__class__.__name__}(id={self.id!r}, key={self.key!r})" + + def __str__(self) -> str: + return repr(self) diff --git a/pykis/event/handler.py b/pykis/event/handler.py index 3640ce80..cb3a0e84 100644 --- a/pykis/event/handler.py +++ b/pykis/event/handler.py @@ -1,3 +1,4 @@ +import warnings from abc import ABCMeta, abstractmethod from typing import ( Callable, @@ -88,6 +89,12 @@ def __filter__(self, handler: "KisEventHandler", sender: TSender, e: TEventArgs) def __hash__(self) -> int: return hash(self.filter) + def __repr__(self) -> str: + return f"{self.__class__.__name__}({self.filter!r})" + + def __str__(self) -> str: + return repr(self) + class KisMultiEventFilter(KisEventFilterBase[TSender, TEventArgs]): """다중 이벤트 필터""" @@ -118,6 +125,12 @@ def __filter__(self, handler: "KisEventHandler", sender: TSender, e: TEventArgs) def __hash__(self) -> int: return hash((self.filters, self.gate)) + def __repr__(self) -> str: + return f"{self.__class__.__name__}({", ".join(repr(filter) for filter in self.filters)}, gate={self.gate!r})" + + def __str__(self) -> str: + return repr(self) + class KisEventCallback(KisEventFilterBase[TSender, TEventArgs], metaclass=ABCMeta): """이벤트 콜백""" @@ -176,6 +189,12 @@ def __hash__(self) -> int: def __del__(self): release_method(self.callback) + def __repr__(self) -> str: + return f"{self.__class__.__name__}({self.callback!r}, where={self.where!r}, once={self.once!r})" + + def __str__(self) -> str: + return repr(self) + EventCallback = Callable[[TSender, TEventArgs], None] | KisEventCallback[TSender, TEventArgs] @@ -245,7 +264,7 @@ def __del__(self): self.unsubscribe() def __repr__(self): - return f"" + return f"<{self.__class__.__name__} callback={self.callback}>" def __str__(self): return repr(self) @@ -370,7 +389,7 @@ def __bool__(self): return bool(self.handlers) def __repr__(self): - return f"" + return f"<{self.__class__.__name__} {len(self.handlers)} handlers>" def __str__(self): return repr(self) From 4cbd943f409506702b2ff4b7ec32c8b57cc7ae9c Mon Sep 17 00:00:00 2001 From: Soju06 Date: Thu, 7 Nov 2024 14:58:31 +0900 Subject: [PATCH 2/3] =?UTF-8?q?=ED=8B=B0=EC=BC=93=20=EC=88=98=EB=AA=85=20?= =?UTF-8?q?=EA=B4=80=EB=A6=AC=20=EA=B2=BD=EA=B3=A0=20=EB=A9=94=EC=8B=9C?= =?UTF-8?q?=EC=A7=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pykis/api/websocket/order_execution.py | 2 +- pykis/event/handler.py | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/pykis/api/websocket/order_execution.py b/pykis/api/websocket/order_execution.py index c21eada3..addb720a 100644 --- a/pykis/api/websocket/order_execution.py +++ b/pykis/api/websocket/order_execution.py @@ -394,7 +394,7 @@ class KisForeignRealtimeOrderExecution(KisRealtimeExecutionBase): None, # 14 BRNC_NO 지점번호 KisDecimal[ "quantity", Decimal(-1) - ], # 15 ODER_QTY 주문수량 ,주문통보인 경우 해당 위치 미출력 (주문통보의 주문수량은 CNTG_QTY 위치에 출력). 체결통보인 경우 해당 위치에 주문수량이 출력 + ], # 15 ODER_QTY 주문수량, 주문통보인 경우 해당 위치 미출력 (주문통보의 주문수량은 CNTG_QTY 위치에 출력). 체결통보인 경우 해당 위치에 주문수량이 출력 None, # 16 ACNT_NAME 계좌명 None, # 17 CNTG_ISNM 체결종목명 KisAny(FOREIGN_MARKET_CODE_MAP.__getitem__)[ diff --git a/pykis/event/handler.py b/pykis/event/handler.py index cb3a0e84..d0756f32 100644 --- a/pykis/event/handler.py +++ b/pykis/event/handler.py @@ -261,6 +261,11 @@ def __exit__(self, exc_type, exc_value, traceback): def __del__(self): if not self._suppress_del: + # 2.1.1 버전 이후부터는 티켓을 명시적으로 해지하지 않으면 경고 메시지를 출력합니다. + warnings.warn( + f"Event ticket {self} was not explicitly unsubscribed, but was unsubscribed due to a resource release.", + UserWarning, + ) self.unsubscribe() def __repr__(self): From 2267b09d57bccdb9e9d2d4546b1d307541e0550f Mon Sep 17 00:00:00 2001 From: Soju06 Date: Thu, 7 Nov 2024 15:09:59 +0900 Subject: [PATCH 3/3] =?UTF-8?q?=ED=8B=B0=EC=BC=93=20=EC=88=98=EB=AA=85=20?= =?UTF-8?q?=EA=B4=80=EB=A6=AC=20=EA=B2=BD=EA=B3=A0=20=EB=A9=94=EC=8B=9C?= =?UTF-8?q?=EC=A7=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pykis/event/handler.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/pykis/event/handler.py b/pykis/event/handler.py index d0756f32..24c7ac41 100644 --- a/pykis/event/handler.py +++ b/pykis/event/handler.py @@ -262,10 +262,12 @@ def __exit__(self, exc_type, exc_value, traceback): def __del__(self): if not self._suppress_del: # 2.1.1 버전 이후부터는 티켓을 명시적으로 해지하지 않으면 경고 메시지를 출력합니다. - warnings.warn( - f"Event ticket {self} was not explicitly unsubscribed, but was unsubscribed due to a resource release.", - UserWarning, - ) + if self.registered: + warnings.warn( + f"Event ticket {self} was not explicitly unsubscribed, but was unsubscribed due to a resource release.", + UserWarning, + ) + self.unsubscribe() def __repr__(self):