Skip to content

Commit 7f40230

Browse files
committed
Switch from typing.Optional to | None.
1 parent 2d195ba commit 7f40230

22 files changed

+334
-330
lines changed

src/websockets/client.py

+8-8
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from __future__ import annotations
22

33
import warnings
4-
from typing import Any, Generator, List, Optional, Sequence
4+
from typing import Any, Generator, List, Sequence
55

66
from .datastructures import Headers, MultipleValuesError
77
from .exceptions import (
@@ -73,12 +73,12 @@ def __init__(
7373
self,
7474
wsuri: WebSocketURI,
7575
*,
76-
origin: Optional[Origin] = None,
77-
extensions: Optional[Sequence[ClientExtensionFactory]] = None,
78-
subprotocols: Optional[Sequence[Subprotocol]] = None,
76+
origin: Origin | None = None,
77+
extensions: Sequence[ClientExtensionFactory] | None = None,
78+
subprotocols: Sequence[Subprotocol] | None = None,
7979
state: State = CONNECTING,
80-
max_size: Optional[int] = 2**20,
81-
logger: Optional[LoggerLike] = None,
80+
max_size: int | None = 2**20,
81+
logger: LoggerLike | None = None,
8282
):
8383
super().__init__(
8484
side=CLIENT,
@@ -261,7 +261,7 @@ def process_extensions(self, headers: Headers) -> List[Extension]:
261261

262262
return accepted_extensions
263263

264-
def process_subprotocol(self, headers: Headers) -> Optional[Subprotocol]:
264+
def process_subprotocol(self, headers: Headers) -> Subprotocol | None:
265265
"""
266266
Handle the Sec-WebSocket-Protocol HTTP response header.
267267
@@ -274,7 +274,7 @@ def process_subprotocol(self, headers: Headers) -> Optional[Subprotocol]:
274274
Subprotocol, if one was selected.
275275
276276
"""
277-
subprotocol: Optional[Subprotocol] = None
277+
subprotocol: Subprotocol | None = None
278278

279279
subprotocols = headers.get_all("Sec-WebSocket-Protocol")
280280

src/websockets/exceptions.py

+9-10
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
from __future__ import annotations
3232

3333
import http
34-
from typing import Optional
3534

3635
from . import datastructures, frames, http11
3736
from .typing import StatusLike
@@ -78,21 +77,21 @@ class ConnectionClosed(WebSocketException):
7877
Raised when trying to interact with a closed connection.
7978
8079
Attributes:
81-
rcvd (Optional[Close]): if a close frame was received, its code and
80+
rcvd (Close | None): if a close frame was received, its code and
8281
reason are available in ``rcvd.code`` and ``rcvd.reason``.
83-
sent (Optional[Close]): if a close frame was sent, its code and reason
82+
sent (Close | None): if a close frame was sent, its code and reason
8483
are available in ``sent.code`` and ``sent.reason``.
85-
rcvd_then_sent (Optional[bool]): if close frames were received and
84+
rcvd_then_sent (bool | None): if close frames were received and
8685
sent, this attribute tells in which order this happened, from the
8786
perspective of this side of the connection.
8887
8988
"""
9089

9190
def __init__(
9291
self,
93-
rcvd: Optional[frames.Close],
94-
sent: Optional[frames.Close],
95-
rcvd_then_sent: Optional[bool] = None,
92+
rcvd: frames.Close | None,
93+
sent: frames.Close | None,
94+
rcvd_then_sent: bool | None = None,
9695
) -> None:
9796
self.rcvd = rcvd
9897
self.sent = sent
@@ -181,7 +180,7 @@ class InvalidHeader(InvalidHandshake):
181180
182181
"""
183182

184-
def __init__(self, name: str, value: Optional[str] = None) -> None:
183+
def __init__(self, name: str, value: str | None = None) -> None:
185184
self.name = name
186185
self.value = value
187186

@@ -221,7 +220,7 @@ class InvalidOrigin(InvalidHeader):
221220
222221
"""
223222

224-
def __init__(self, origin: Optional[str]) -> None:
223+
def __init__(self, origin: str | None) -> None:
225224
super().__init__("Origin", origin)
226225

227226

@@ -301,7 +300,7 @@ class InvalidParameterValue(NegotiationError):
301300
302301
"""
303302

304-
def __init__(self, name: str, value: Optional[str]) -> None:
303+
def __init__(self, name: str, value: str | None) -> None:
305304
self.name = name
306305
self.value = value
307306

src/websockets/extensions/base.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from __future__ import annotations
22

3-
from typing import List, Optional, Sequence, Tuple
3+
from typing import List, Sequence, Tuple
44

55
from .. import frames
66
from ..typing import ExtensionName, ExtensionParameter
@@ -22,7 +22,7 @@ def decode(
2222
self,
2323
frame: frames.Frame,
2424
*,
25-
max_size: Optional[int] = None,
25+
max_size: int | None = None,
2626
) -> frames.Frame:
2727
"""
2828
Decode an incoming frame.

src/websockets/extensions/permessage_deflate.py

+16-16
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import dataclasses
44
import zlib
5-
from typing import Any, Dict, List, Optional, Sequence, Tuple, Union
5+
from typing import Any, Dict, List, Sequence, Tuple, Union
66

77
from .. import exceptions, frames
88
from ..typing import ExtensionName, ExtensionParameter
@@ -36,7 +36,7 @@ def __init__(
3636
local_no_context_takeover: bool,
3737
remote_max_window_bits: int,
3838
local_max_window_bits: int,
39-
compress_settings: Optional[Dict[Any, Any]] = None,
39+
compress_settings: Dict[Any, Any] | None = None,
4040
) -> None:
4141
"""
4242
Configure the Per-Message Deflate extension.
@@ -84,7 +84,7 @@ def decode(
8484
self,
8585
frame: frames.Frame,
8686
*,
87-
max_size: Optional[int] = None,
87+
max_size: int | None = None,
8888
) -> frames.Frame:
8989
"""
9090
Decode an incoming frame.
@@ -174,8 +174,8 @@ def encode(self, frame: frames.Frame) -> frames.Frame:
174174
def _build_parameters(
175175
server_no_context_takeover: bool,
176176
client_no_context_takeover: bool,
177-
server_max_window_bits: Optional[int],
178-
client_max_window_bits: Optional[Union[int, bool]],
177+
server_max_window_bits: int | None,
178+
client_max_window_bits: Union[int, bool] | None,
179179
) -> List[ExtensionParameter]:
180180
"""
181181
Build a list of ``(name, value)`` pairs for some compression parameters.
@@ -197,7 +197,7 @@ def _build_parameters(
197197

198198
def _extract_parameters(
199199
params: Sequence[ExtensionParameter], *, is_server: bool
200-
) -> Tuple[bool, bool, Optional[int], Optional[Union[int, bool]]]:
200+
) -> Tuple[bool, bool, int | None, Union[int, bool] | None]:
201201
"""
202202
Extract compression parameters from a list of ``(name, value)`` pairs.
203203
@@ -207,8 +207,8 @@ def _extract_parameters(
207207
"""
208208
server_no_context_takeover: bool = False
209209
client_no_context_takeover: bool = False
210-
server_max_window_bits: Optional[int] = None
211-
client_max_window_bits: Optional[Union[int, bool]] = None
210+
server_max_window_bits: int | None = None
211+
client_max_window_bits: Union[int, bool] | None = None
212212

213213
for name, value in params:
214214
if name == "server_no_context_takeover":
@@ -286,9 +286,9 @@ def __init__(
286286
self,
287287
server_no_context_takeover: bool = False,
288288
client_no_context_takeover: bool = False,
289-
server_max_window_bits: Optional[int] = None,
290-
client_max_window_bits: Optional[Union[int, bool]] = True,
291-
compress_settings: Optional[Dict[str, Any]] = None,
289+
server_max_window_bits: int | None = None,
290+
client_max_window_bits: Union[int, bool] | None = True,
291+
compress_settings: Dict[str, Any] | None = None,
292292
) -> None:
293293
"""
294294
Configure the Per-Message Deflate extension factory.
@@ -433,7 +433,7 @@ def process_response_params(
433433

434434

435435
def enable_client_permessage_deflate(
436-
extensions: Optional[Sequence[ClientExtensionFactory]],
436+
extensions: Sequence[ClientExtensionFactory] | None,
437437
) -> Sequence[ClientExtensionFactory]:
438438
"""
439439
Enable Per-Message Deflate with default settings in client extensions.
@@ -489,9 +489,9 @@ def __init__(
489489
self,
490490
server_no_context_takeover: bool = False,
491491
client_no_context_takeover: bool = False,
492-
server_max_window_bits: Optional[int] = None,
493-
client_max_window_bits: Optional[int] = None,
494-
compress_settings: Optional[Dict[str, Any]] = None,
492+
server_max_window_bits: int | None = None,
493+
client_max_window_bits: int | None = None,
494+
compress_settings: Dict[str, Any] | None = None,
495495
require_client_max_window_bits: bool = False,
496496
) -> None:
497497
"""
@@ -635,7 +635,7 @@ def process_request_params(
635635

636636

637637
def enable_server_permessage_deflate(
638-
extensions: Optional[Sequence[ServerExtensionFactory]],
638+
extensions: Sequence[ServerExtensionFactory] | None,
639639
) -> Sequence[ServerExtensionFactory]:
640640
"""
641641
Enable Per-Message Deflate with default settings in server extensions.

src/websockets/frames.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import io
66
import secrets
77
import struct
8-
from typing import Callable, Generator, Optional, Sequence, Tuple
8+
from typing import Callable, Generator, Sequence, Tuple
99

1010
from . import exceptions, extensions
1111
from .typing import Data
@@ -205,8 +205,8 @@ def parse(
205205
read_exact: Callable[[int], Generator[None, None, bytes]],
206206
*,
207207
mask: bool,
208-
max_size: Optional[int] = None,
209-
extensions: Optional[Sequence[extensions.Extension]] = None,
208+
max_size: int | None = None,
209+
extensions: Sequence[extensions.Extension] | None = None,
210210
) -> Generator[None, None, Frame]:
211211
"""
212212
Parse a WebSocket frame.
@@ -280,7 +280,7 @@ def serialize(
280280
self,
281281
*,
282282
mask: bool,
283-
extensions: Optional[Sequence[extensions.Extension]] = None,
283+
extensions: Sequence[extensions.Extension] | None = None,
284284
) -> bytes:
285285
"""
286286
Serialize a WebSocket frame.

src/websockets/headers.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import binascii
55
import ipaddress
66
import re
7-
from typing import Callable, List, Optional, Sequence, Tuple, TypeVar, cast
7+
from typing import Callable, List, Sequence, Tuple, TypeVar, cast
88

99
from . import exceptions
1010
from .typing import (
@@ -63,7 +63,7 @@ def build_host(host: str, port: int, secure: bool) -> str:
6363
# https://www.rfc-editor.org/rfc/rfc7230.html#appendix-B.
6464

6565

66-
def peek_ahead(header: str, pos: int) -> Optional[str]:
66+
def peek_ahead(header: str, pos: int) -> str | None:
6767
"""
6868
Return the next character from ``header`` at the given position.
6969
@@ -314,7 +314,7 @@ def parse_extension_item_param(
314314
name, pos = parse_token(header, pos, header_name)
315315
pos = parse_OWS(header, pos)
316316
# Extract parameter value, if there is one.
317-
value: Optional[str] = None
317+
value: str | None = None
318318
if peek_ahead(header, pos) == "=":
319319
pos = parse_OWS(header, pos + 1)
320320
if peek_ahead(header, pos) == '"':

src/websockets/http11.py

+7-7
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import dataclasses
44
import re
55
import warnings
6-
from typing import Callable, Generator, Optional
6+
from typing import Callable, Generator
77

88
from . import datastructures, exceptions
99

@@ -62,10 +62,10 @@ class Request:
6262
headers: datastructures.Headers
6363
# body isn't useful is the context of this library.
6464

65-
_exception: Optional[Exception] = None
65+
_exception: Exception | None = None
6666

6767
@property
68-
def exception(self) -> Optional[Exception]: # pragma: no cover
68+
def exception(self) -> Exception | None: # pragma: no cover
6969
warnings.warn(
7070
"Request.exception is deprecated; "
7171
"use ServerProtocol.handshake_exc instead",
@@ -164,12 +164,12 @@ class Response:
164164
status_code: int
165165
reason_phrase: str
166166
headers: datastructures.Headers
167-
body: Optional[bytes] = None
167+
body: bytes | None = None
168168

169-
_exception: Optional[Exception] = None
169+
_exception: Exception | None = None
170170

171171
@property
172-
def exception(self) -> Optional[Exception]: # pragma: no cover
172+
def exception(self) -> Exception | None: # pragma: no cover
173173
warnings.warn(
174174
"Response.exception is deprecated; "
175175
"use ClientProtocol.handshake_exc instead",
@@ -245,7 +245,7 @@ def parse(
245245
if 100 <= status_code < 200 or status_code == 204 or status_code == 304:
246246
body = None
247247
else:
248-
content_length: Optional[int]
248+
content_length: int | None
249249
try:
250250
# MultipleValuesError is sufficiently unlikely that we don't
251251
# attempt to handle it. Instead we document that its parent

src/websockets/imports.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from __future__ import annotations
22

33
import warnings
4-
from typing import Any, Dict, Iterable, Optional
4+
from typing import Any, Dict, Iterable
55

66

77
__all__ = ["lazy_import"]
@@ -30,8 +30,8 @@ def import_name(name: str, source: str, namespace: Dict[str, Any]) -> Any:
3030

3131
def lazy_import(
3232
namespace: Dict[str, Any],
33-
aliases: Optional[Dict[str, str]] = None,
34-
deprecated_aliases: Optional[Dict[str, str]] = None,
33+
aliases: Dict[str, str] | None = None,
34+
deprecated_aliases: Dict[str, str] | None = None,
3535
) -> None:
3636
"""
3737
Provide lazy, module-level imports.

0 commit comments

Comments
 (0)