Skip to content

Commit a968ea3

Browse files
committed
OPT: add __slots__ to the dataclasses ⚡️
1 parent b230cfd commit a968ea3

File tree

11 files changed

+32
-28
lines changed

11 files changed

+32
-28
lines changed

combadge/_helpers/__init__.py

Whitespace-only changes.

combadge/_helpers/dataclasses.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from sys import version_info
2+
3+
SLOTS = {"slots": True} if version_info >= (3, 10) else {}
File renamed without changes.

combadge/support/http/markers/request.py

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
from typing_extensions import Annotated, TypeAlias, override
99

10+
from combadge._helpers.dataclasses import SLOTS
11+
from combadge._helpers.pydantic import get_type_adapter
1012
from combadge.core.markers.method import MethodMarker
1113
from combadge.core.markers.parameter import ParameterMarker
1214
from combadge.core.typevars import FunctionT
@@ -18,12 +20,11 @@
1820
ContainsQueryParams,
1921
ContainsUrlPath,
2022
)
21-
from combadge.support.shared.functools import get_type_adapter
2223

2324
_T = TypeVar("_T")
2425

2526

26-
@dataclass
27+
@dataclass(**SLOTS)
2728
class CustomHeader(ParameterMarker[ContainsHeaders]):
2829
"""
2930
Mark a parameter as a header value. Argument is passed «as is» during a service call.
@@ -35,7 +36,6 @@ class CustomHeader(ParameterMarker[ContainsHeaders]):
3536
"""
3637

3738
name: str
38-
__slots__ = ("name",)
3939

4040
@override
4141
def __call__(self, request: ContainsHeaders, value: Any) -> None: # noqa: D102
@@ -83,7 +83,7 @@ def path(path_or_factory: str | Callable[..., str]) -> Callable[[FunctionT], Fun
8383
return Path[Any](path_or_factory).mark
8484

8585

86-
@dataclass
86+
@dataclass(**SLOTS)
8787
class HttpMethod(Generic[FunctionT], MethodMarker[ContainsMethod, FunctionT]): # noqa: D101
8888
method: str
8989

@@ -103,7 +103,7 @@ def http_method(method: str) -> Callable[[FunctionT], FunctionT]:
103103
return HttpMethod[Any](method).mark
104104

105105

106-
@dataclass
106+
@dataclass(**SLOTS)
107107
class QueryParam(ParameterMarker[ContainsQueryParams]):
108108
"""
109109
Mark parameter as a query parameter.
@@ -114,7 +114,6 @@ class QueryParam(ParameterMarker[ContainsQueryParams]):
114114
"""
115115

116116
name: str
117-
__slots__ = ("name",)
118117

119118
@override
120119
def __call__(self, request: ContainsQueryParams, value: Any) -> None: # noqa: D102
@@ -123,7 +122,7 @@ def __call__(self, request: ContainsQueryParams, value: Any) -> None: # noqa: D
123122

124123
if not TYPE_CHECKING:
125124

126-
@dataclass
125+
@dataclass(**SLOTS)
127126
class Payload(ParameterMarker[ContainsPayload]):
128127
"""
129128
Mark parameter as a request payload. An argument gets converted to a dictionary and passed over to a backend.
@@ -170,7 +169,7 @@ def __class_getitem__(cls, item: type[Any]) -> Any:
170169
Payload: TypeAlias = _T
171170

172171

173-
@dataclass
172+
@dataclass(**SLOTS)
174173
class Field(ParameterMarker[ContainsPayload]):
175174
"""
176175
Mark a parameter as a value of a separate payload field.
@@ -184,7 +183,6 @@ class Field(ParameterMarker[ContainsPayload]):
184183
"""
185184

186185
name: str
187-
__slots__ = ("name",)
188186

189187
@override
190188
def __call__(self, request: ContainsPayload, value: Any) -> None: # noqa: D102
@@ -195,7 +193,7 @@ def __call__(self, request: ContainsPayload, value: Any) -> None: # noqa: D102
195193

196194
if not TYPE_CHECKING:
197195

198-
@dataclass
196+
@dataclass(**SLOTS)
199197
class FormData(ParameterMarker[ContainsFormData]):
200198
"""
201199
Mark parameter as a request form data.
@@ -210,8 +208,6 @@ class FormData(ParameterMarker[ContainsFormData]):
210208
>>> ...
211209
"""
212210

213-
__slots__ = ()
214-
215211
@override
216212
def __call__(self, request: ContainsFormData, value: Any) -> None: # noqa: D102
217213
value = get_type_adapter(type(value)).dump_python(value, by_alias=True)
@@ -227,7 +223,7 @@ def __class_getitem__(cls, item: type[Any]) -> Any:
227223
FormData: TypeAlias = _T
228224

229225

230-
@dataclass
226+
@dataclass(**SLOTS)
231227
class FormField(ParameterMarker[ContainsFormData]):
232228
"""
233229
Mark a parameter as a separate form field value.
@@ -243,7 +239,6 @@ class FormField(ParameterMarker[ContainsFormData]):
243239
""" # noqa: E501
244240

245241
name: str
246-
__slots__ = ("name",)
247242

248243
@override
249244
def __call__(self, request: ContainsFormData, value: Any) -> None: # noqa: D102

combadge/support/http/markers/response.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,12 @@
77
# noinspection PyUnresolvedReferences
88
from typing_extensions import override
99

10+
from combadge._helpers.dataclasses import SLOTS
1011
from combadge.core.markers.response import ResponseMarker
1112
from combadge.support.http.abc import SupportsReasonPhrase, SupportsStatusCode, SupportsText
1213

1314

14-
@dataclass
15+
@dataclass(**SLOTS)
1516
class StatusCode(ResponseMarker):
1617
"""
1718
Build a payload with response status code.
@@ -29,7 +30,7 @@ def __call__(self, response: SupportsStatusCode, input_: Any) -> Dict[Any, Any]:
2930
return {self.key: HTTPStatus(response.status_code)}
3031

3132

32-
@dataclass
33+
@dataclass(**SLOTS)
3334
class ReasonPhrase(ResponseMarker):
3435
"""Build a payload with HTTP reason message."""
3536

@@ -41,7 +42,7 @@ def __call__(self, response: SupportsReasonPhrase, input_: Any) -> Dict[Any, Any
4142
return {self.key: response.reason_phrase}
4243

4344

44-
@dataclass
45+
@dataclass(**SLOTS)
4546
class Text(ResponseMarker):
4647
"""
4748
Build a payload with HTTP response text.

combadge/support/http/request.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from dataclasses import dataclass
22

3+
from combadge._helpers.dataclasses import SLOTS
34
from combadge.support.http.abc import (
45
ContainsFormData,
56
ContainsHeaders,
@@ -11,7 +12,7 @@
1112
from combadge.support.shared.request import BaseBackendRequest
1213

1314

14-
@dataclass
15+
@dataclass(**SLOTS)
1516
class Request(
1617
ContainsMethod,
1718
ContainsUrlPath,

combadge/support/shared/request.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
from abc import ABC
22
from dataclasses import dataclass
33

4+
from combadge._helpers.dataclasses import SLOTS
45

5-
@dataclass
6+
7+
@dataclass(**SLOTS)
68
class BaseBackendRequest(ABC): # noqa: B024
79
"""Base class for protocol-dependent requests."""
8-
9-
__slots__ = ()

combadge/support/soap/abc.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22
from dataclasses import dataclass
33
from typing import Optional
44

5+
from combadge._helpers.dataclasses import SLOTS
56

6-
@dataclass
7+
8+
@dataclass(**SLOTS)
79
class ContainsOperationName(ABC):
810
"""SOAP operation name."""
911

combadge/support/soap/markers.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,16 @@
55
# noinspection PyUnresolvedReferences
66
from typing_extensions import override
77

8+
from combadge._helpers.dataclasses import SLOTS
89
from combadge.core.markers.method import MethodMarker
910
from combadge.core.typevars import FunctionT
1011
from combadge.support.soap.abc import ContainsOperationName
1112

1213

13-
@dataclass
14+
@dataclass(**SLOTS)
1415
class OperationName(Generic[FunctionT], MethodMarker[ContainsOperationName, FunctionT]): # noqa: D101
1516
name: str
1617

17-
__slots__ = ("name",)
18-
1918
@override
2019
def prepare_request(self, request: ContainsOperationName, _arguments: BoundArguments) -> None: # noqa: D102
2120
request.operation_name = self.name

combadge/support/soap/request.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
from dataclasses import dataclass
22

3+
from combadge._helpers.dataclasses import SLOTS
34
from combadge.support.http.abc import ContainsPayload
45
from combadge.support.shared.request import BaseBackendRequest
56
from combadge.support.soap.abc import ContainsOperationName
67

78

8-
@dataclass
9+
@dataclass(**SLOTS)
910
class Request(ContainsOperationName, ContainsPayload, BaseBackendRequest):
1011
"""Backend-agnostic SOAP request."""

combadge/support/zeep/backends/base.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
from dataclasses import dataclass
55
from typing import Any, Generic, TypeVar, Union
66

7+
from combadge._helpers.dataclasses import SLOTS
8+
79
try:
810
from types import UnionType # type: ignore[attr-defined]
911
except ImportError:
@@ -95,15 +97,15 @@ def _parse_soap_fault(exception: Fault, fault_type: TypeAdapter[_SoapFaultT]) ->
9597
return fault_type.validate_python(exception.__dict__)
9698

9799

98-
@dataclass
100+
@dataclass(**SLOTS)
99101
class ByBindingName:
100102
"""Create service by binding name and address."""
101103

102104
binding_name: str
103105
address: str
104106

105107

106-
@dataclass
108+
@dataclass(**SLOTS)
107109
class ByServiceName:
108110
"""Create service by service and port names."""
109111

0 commit comments

Comments
 (0)