From cc5a90405c5a024426f293e0aa8b71cc95973616 Mon Sep 17 00:00:00 2001 From: Faraphel Date: Tue, 7 Mar 2023 10:14:16 +0100 Subject: [PATCH] fixed type hint for packets --- source/network/Client.py | 3 +-- source/network/game_network.py | 2 +- source/network/packet/abc/Packet.py | 13 ++++++++----- source/network/packet/abc/SignalPacket.py | 6 +++++- source/network/packet/abc/SimplePacket.py | 8 ++++++-- source/network/packet/abc/VariableLengthPacket.py | 6 +++++- 6 files changed, 26 insertions(+), 12 deletions(-) diff --git a/source/network/Client.py b/source/network/Client.py index e7e7281..1a8436d 100644 --- a/source/network/Client.py +++ b/source/network/Client.py @@ -12,7 +12,6 @@ from source.utils.thread import in_pyglet_context if TYPE_CHECKING: from source.gui.window import Window - from source.gui.scene import RoomJoin class Client(StoppableThread): @@ -97,7 +96,7 @@ class Client(StoppableThread): # paramètres & jeu - settings: Any = PacketSettings.from_connection(connection) + settings = PacketSettings.from_connection(connection) PacketUsername(username=self.username).send_data_connection(connection) enemy_username = PacketUsername.from_connection(connection).username diff --git a/source/network/game_network.py b/source/network/game_network.py index 3648e8f..62079f8 100644 --- a/source/network/game_network.py +++ b/source/network/game_network.py @@ -34,7 +34,7 @@ def game_network( try: while True: - data_type: Type["Packet"] = Packet.type_from_connection(connection) + data_type = Packet.type_from_connection(connection) if data_type is None: if thread.stopped: return # vérifie si le thread n'est pas censé s'arrêter diff --git a/source/network/packet/abc/Packet.py b/source/network/packet/abc/Packet.py index 74beb77..77a263b 100644 --- a/source/network/packet/abc/Packet.py +++ b/source/network/packet/abc/Packet.py @@ -1,7 +1,10 @@ import socket from abc import abstractmethod, ABC from inspect import isabstract -from typing import Type, Optional +from typing import Optional, TypeVar + + +T = TypeVar("T", bound="Packet") class Packet(ABC): @@ -12,7 +15,7 @@ class Packet(ABC): The to_bytes and from_connection method need to be defined. """ - packet_types: set[Type["Packet"]] = set() + packet_types: set[T] = set() packet_header: bytes packet_id: int = 0 @@ -48,7 +51,7 @@ class Packet(ABC): connection.send(self.to_bytes()) @classmethod - def type_from_header(cls, packet_header: bytes) -> Type["Packet"]: + def type_from_header(cls, packet_header: bytes) -> T: """ Get a subclass from its packet header. :param packet_header: the header to find the corresponding subclass @@ -61,7 +64,7 @@ class Packet(ABC): )) @classmethod - def type_from_connection(cls, connection: socket.socket) -> Optional[Type["Packet"]]: + def type_from_connection(cls, connection: socket.socket) -> Optional[T]: try: packet_header = connection.recv(1) except socket.timeout: @@ -72,7 +75,7 @@ class Packet(ABC): @classmethod @abstractmethod - def from_connection(cls, connection: socket.socket) -> "Packet": + def from_connection(cls, connection: socket.socket) -> T: """ Receive a packet from a socket. :param connection: the socket where to get the data from diff --git a/source/network/packet/abc/SignalPacket.py b/source/network/packet/abc/SignalPacket.py index 60c5098..d33b729 100644 --- a/source/network/packet/abc/SignalPacket.py +++ b/source/network/packet/abc/SignalPacket.py @@ -1,9 +1,13 @@ from abc import ABC import socket +from typing import TypeVar from source.network.packet.abc import Packet +T = TypeVar("T", bound="SignalPacket") + + class SignalPacket(Packet, ABC): """ A packet that has for only usage to send a signal thanks to the type of the class. @@ -14,5 +18,5 @@ class SignalPacket(Packet, ABC): return b"" @classmethod - def from_connection(cls, connection: socket.socket) -> "SignalPacket": + def from_connection(cls, connection: socket.socket) -> T: return cls() diff --git a/source/network/packet/abc/SimplePacket.py b/source/network/packet/abc/SimplePacket.py index 26a5039..eaed3b4 100644 --- a/source/network/packet/abc/SimplePacket.py +++ b/source/network/packet/abc/SimplePacket.py @@ -1,10 +1,14 @@ import socket import struct from abc import ABC, abstractmethod +from typing import TypeVar from source.network.packet.abc import Packet +T = TypeVar("T", bound="SimplePacket") + + class SimplePacket(Packet, ABC): """ A packet with a simple packet format. @@ -15,7 +19,7 @@ class SimplePacket(Packet, ABC): @classmethod @abstractmethod - def from_bytes(cls, data: bytes) -> "Packet": + def from_bytes(cls, data: bytes) -> T: """ Convert a bytes object into a packet. :param data: the data to convert into a packet. Should be "packet_size" long. @@ -24,7 +28,7 @@ class SimplePacket(Packet, ABC): pass @classmethod - def from_connection(cls, connection: socket.socket) -> "Packet": + def from_connection(cls, connection: socket.socket) -> T: # récupère la taille du packet en fonction du format et charge # les données dans une nouvelle instance. packet_size: int = struct.calcsize(cls.packet_format) diff --git a/source/network/packet/abc/VariableLengthPacket.py b/source/network/packet/abc/VariableLengthPacket.py index 6147e0b..7174685 100644 --- a/source/network/packet/abc/VariableLengthPacket.py +++ b/source/network/packet/abc/VariableLengthPacket.py @@ -1,10 +1,14 @@ import socket import struct from abc import ABC, abstractmethod +from typing import TypeVar from source.network.packet.abc import Packet +T = TypeVar("T", bound="VariableLengthPacket") + + class VariableLengthPacket(Packet, ABC): """ A Packet that represent a single value that can be encoded with a variable length. @@ -31,7 +35,7 @@ class VariableLengthPacket(Packet, ABC): pass @classmethod - def from_connection(cls, connection: socket.socket) -> "Packet": + def from_connection(cls, connection: socket.socket) -> T: data_len, *_ = struct.unpack( cls.packet_format, connection.recv(struct.calcsize(cls.packet_format))