Skip to content

Commit 18630e3

Browse files
committed
it seems we cannot combine required fields in subclass with superclass having optional ones when using dataclasses
1 parent ceeacb0 commit 18630e3

3 files changed

Lines changed: 9 additions & 5 deletions

File tree

src/scpi/transports/gpib/prologix.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ class PrologixRS232SerialProtocol(RS232SerialProtocol):
2121
TERMINATOR = b"\n"
2222

2323

24-
@dataclass # type ignored to workaround nondefault cannot follow default
25-
class PrologixGPIBTransport(GPIBTransport, RS232Transport): # type: ignore
24+
@dataclass
25+
class PrologixGPIBTransport(GPIBTransport, RS232Transport):
2626
"""Transport "driver" for the Prologix USB-GPIB controller (v6 protocol)"""
2727

2828
def __post_init__(self) -> None:

src/scpi/transports/rs232.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,13 @@ def handle_line(self, line: str) -> None:
3333
class RS232Transport(BaseTransport):
3434
"""Uses PySerials ReaderThread in the background to save us some pain"""
3535

36-
serialdevice: serial.SerialBase = field(repr=True) # type: ignore # workaround nondefault cannot follow default
36+
serialdevice: Optional[serial.SerialBase] = field(default=None)
3737
_serialhandler: Optional[serial.threaded.ReaderThread] = field(default=None, repr=False)
3838

3939
def __post_init__(self) -> None:
4040
"""Initialize the transport"""
41+
if not self.serialdevice:
42+
raise ValueError("serialdevice must be given")
4143
self._serialhandler = serial.threaded.ReaderThread(self.serialdevice, RS232SerialProtocol)
4244
self._serialhandler.start()
4345
self._serialhandler.protocol.handle_line = self.message_received

src/scpi/transports/tcp.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@
1515
class TCPTransport(BaseTransport):
1616
"""TCP based transport"""
1717

18-
ipaddr: str = field() # type: ignore # workaround nondefault cannot follow default
19-
port: int = field() # type: ignore # workaround nondefault cannot follow default
18+
ipaddr: Optional[str] = field(default=None)
19+
port: Optional[int] = field(default=None)
2020
reader: Optional[asyncio.StreamReader] = field(default=None)
2121
writer: Optional[asyncio.StreamWriter] = field(default=None)
2222

@@ -28,6 +28,8 @@ async def open_connection(self, ipaddr: str, port: int) -> None:
2828

2929
def __post_init__(self) -> None:
3030
"""Call open_connection in an eventloop"""
31+
if self.ipaddr is None or self.port is None:
32+
raise ValueError("ipaddr and port must be given")
3133
loop = asyncio.get_event_loop()
3234
loop.run_until_complete(self.open_connection(self.ipaddr, self.port))
3335

0 commit comments

Comments
 (0)