Skip to content

Commit c27e41c

Browse files
Make various email.Policy use sites generic over the message type (#13274)
1 parent 9135645 commit c27e41c

File tree

3 files changed

+33
-13
lines changed

3 files changed

+33
-13
lines changed

stdlib/email/__init__.pyi

+28-6
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from collections.abc import Callable
22
from email.message import Message
3-
from email.policy import Policy
4-
from typing import IO
3+
from email.policy import Policy, _MessageT
4+
from typing import IO, overload
55
from typing_extensions import TypeAlias
66

77
# At runtime, listing submodules in __all__ without them being imported is
@@ -31,7 +31,29 @@ __all__ = [ # noqa: F822 # Undefined names in __all__
3131
_ParamType: TypeAlias = str | tuple[str | None, str | None, str] # noqa: Y047
3232
_ParamsType: TypeAlias = str | None | tuple[str, str | None, str] # noqa: Y047
3333

34-
def message_from_string(s: str, _class: Callable[[], Message] = ..., *, policy: Policy = ...) -> Message: ...
35-
def message_from_bytes(s: bytes | bytearray, _class: Callable[[], Message] = ..., *, policy: Policy = ...) -> Message: ...
36-
def message_from_file(fp: IO[str], _class: Callable[[], Message] = ..., *, policy: Policy = ...) -> Message: ...
37-
def message_from_binary_file(fp: IO[bytes], _class: Callable[[], Message] = ..., *, policy: Policy = ...) -> Message: ...
34+
@overload
35+
def message_from_string(s: str) -> Message: ...
36+
@overload
37+
def message_from_string(s: str, _class: Callable[[], _MessageT]) -> _MessageT: ...
38+
@overload
39+
def message_from_string(s: str, _class: Callable[[], _MessageT] = ..., *, policy: Policy[_MessageT]) -> _MessageT: ...
40+
@overload
41+
def message_from_bytes(s: bytes | bytearray) -> Message: ...
42+
@overload
43+
def message_from_bytes(s: bytes | bytearray, _class: Callable[[], _MessageT]) -> _MessageT: ...
44+
@overload
45+
def message_from_bytes(
46+
s: bytes | bytearray, _class: Callable[[], _MessageT] = ..., *, policy: Policy[_MessageT]
47+
) -> _MessageT: ...
48+
@overload
49+
def message_from_file(fp: IO[str]) -> Message: ...
50+
@overload
51+
def message_from_file(fp: IO[str], _class: Callable[[], _MessageT]) -> _MessageT: ...
52+
@overload
53+
def message_from_file(fp: IO[str], _class: Callable[[], _MessageT] = ..., *, policy: Policy[_MessageT]) -> _MessageT: ...
54+
@overload
55+
def message_from_binary_file(fp: IO[bytes]) -> Message: ...
56+
@overload
57+
def message_from_binary_file(fp: IO[bytes], _class: Callable[[], _MessageT]) -> _MessageT: ...
58+
@overload
59+
def message_from_binary_file(fp: IO[bytes], _class: Callable[[], _MessageT] = ..., *, policy: Policy[_MessageT]) -> _MessageT: ...

stdlib/email/mime/message.pyi

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
from email.message import Message
21
from email.mime.nonmultipart import MIMENonMultipart
3-
from email.policy import Policy
2+
from email.policy import Policy, _MessageT
43

54
__all__ = ["MIMEMessage"]
65

76
class MIMEMessage(MIMENonMultipart):
8-
def __init__(self, _msg: Message, _subtype: str = "rfc822", *, policy: Policy | None = None) -> None: ...
7+
def __init__(self, _msg: _MessageT, _subtype: str = "rfc822", *, policy: Policy[_MessageT] | None = None) -> None: ...

stdlib/email/mime/multipart.pyi

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
from collections.abc import Sequence
22
from email import _ParamsType
3-
from email.message import Message
43
from email.mime.base import MIMEBase
5-
from email.policy import Policy
4+
from email.policy import Policy, _MessageT
65

76
__all__ = ["MIMEMultipart"]
87

@@ -11,8 +10,8 @@ class MIMEMultipart(MIMEBase):
1110
self,
1211
_subtype: str = "mixed",
1312
boundary: str | None = None,
14-
_subparts: Sequence[Message] | None = None,
13+
_subparts: Sequence[_MessageT] | None = None,
1514
*,
16-
policy: Policy | None = None,
15+
policy: Policy[_MessageT] | None = None,
1716
**_params: _ParamsType,
1817
) -> None: ...

0 commit comments

Comments
 (0)